QAudioBuffer in QByteArray umwandeln
-
Hallo zusammen :),
Ich habe eine WAV-Datei, die ich mit der QAudioDekoder dekodiere. Als Ergebnis habe ich ein QAudioBuffer Objekt. Ich möchte die in QAudioBuffer gespeicherten Daten in einem QByteArray für meine von QIODevice abgeleitete Klasse speichert. Diese Daten möchte ich in der ReadData-Methode meiner abgeleiteten Klasse für Audio-Ausgabe verwenden. Ich habe nun 2 Fragen:- Wie kann man aus einem QAuddioBuffer ein QByteArray erhalten?
Ich habe den folgenden Code verwendet, aber das stimmt leider nicht. Die Daten in QAudioBuffer sind auf 2Bytes kodiert, aber jedes Element in einem QByteArray ist auf 1Byte kodiert (oder?). Zum Testen, ob in QByteArray die original Daten von der WAV Datei drin sind, speichere ich sie in einen TXT-File - Ist dieses Vorgehen gut geeignet? Ich möchte eigentlich ein paar Operationen auf die in QAudioBuffer gespeicherten Daten anwenden (z. B. Filter) und das Ergebnis in Echtzeit anhören.
Danke im Voraus.
Hier der Code
QAudioFormat *format_decoder; format_decoder = new QAudioFormat; format_decoder->setSampleRate(44100); format_decoder->setChannelCount(1); format_decoder->setSampleFormat(QAudioFormat::Int16); QAudioDecoder decoder; decoder.setSource(filenameSource); decoder.setAudioFormat(*format_decoder); decoder.start(); QObject::connect(&decoder, &QAudioDecoder::bufferReady, this, &MainWindow::test_copy_to_txt);
und der Slot
void MainWindow::slot_bufReady(){ QAudioBuffer buffer = m_audioDecoder->read(); QByteArray buffer_ByteArray(buffer.constData<char>(), buffer.byteCount()); QFile file(filenameTest1); if(!file.open(QIODevice::WriteOnly|QIODevice::Append)) { qDebug() << "ERRO "; } QTextStream strem(&file); for(auto const dat: buffer_ByteArray) { strem<< qreal(dat)/128.0<< "\r\n"; } file.cloe(); }
- Wie kann man aus einem QAuddioBuffer ein QByteArray erhalten?
-
Da es binärdaten sind sollte man sie nicht als text (QTextStream) behandeln sondern als binärstream -> QFile::write()
-
Da es binärdaten sind sollte man sie nicht als text (QTextStream) behandeln sondern als binärstream -> QFile::write()
@Christian-Ehrlicher Danke für Ihre Meldung.
Ich habe im Code die for-Schleife durch Folgendes ersetzt,file.write(buffer_ByteArray);
. Ich ahbe auch mitfile.write(buffer.constData<char>());
probiert, aber im TXT-Datei waren leider nicht die Daten aus der originalen WAV-Datei zu finden. Es werden nur Charakter gespeichert, die dem originalen Signal nicht entsprechen (Eine Auswertung der TXT-Datei mit Matlab zeigt es deutlich). Ich glaube, das liegt daran, dass die Konvertierung von QAudioBuffer zu QByteArray nicht richtig durchgeführt war. In dem QAudioBuffer Objekt ist jedes Element auf 2 Bytes kodiert, aber in QByteArray auf 1 Byte.
Ich glaube, wenn ichQByteArray buffer_ByteArray(buffer.constData<char>(), buffer.byteCount());
schreibe, dann:- Ein Element von dem QAudioBuffer wird in 2 Elemente von je 1 Byte geteilt, um ein QByteArray auszufüllen.
- Es folgt, dass die Anzahl der Sample-Wert doppelt ist, als es sollte und die Werte nicht stimmen.
Mein Hauptproblem liegt eigentlich bei der Konvertierung von einem 16bit sample QAudioBuffer in einem QByteArray
-
@Christian-Ehrlicher Danke für Ihre Meldung.
Ich habe im Code die for-Schleife durch Folgendes ersetzt,file.write(buffer_ByteArray);
. Ich ahbe auch mitfile.write(buffer.constData<char>());
probiert, aber im TXT-Datei waren leider nicht die Daten aus der originalen WAV-Datei zu finden. Es werden nur Charakter gespeichert, die dem originalen Signal nicht entsprechen (Eine Auswertung der TXT-Datei mit Matlab zeigt es deutlich). Ich glaube, das liegt daran, dass die Konvertierung von QAudioBuffer zu QByteArray nicht richtig durchgeführt war. In dem QAudioBuffer Objekt ist jedes Element auf 2 Bytes kodiert, aber in QByteArray auf 1 Byte.
Ich glaube, wenn ichQByteArray buffer_ByteArray(buffer.constData<char>(), buffer.byteCount());
schreibe, dann:- Ein Element von dem QAudioBuffer wird in 2 Elemente von je 1 Byte geteilt, um ein QByteArray auszufüllen.
- Es folgt, dass die Anzahl der Sample-Wert doppelt ist, als es sollte und die Werte nicht stimmen.
Mein Hauptproblem liegt eigentlich bei der Konvertierung von einem 16bit sample QAudioBuffer in einem QByteArray
@Kev_ said in QAudioBuffer in QByteArray umwandeln:
dass die Konvertierung von QAudioBuffer zu QByteArray nicht richtig durchgeführt war. In dem QAudioBuffer Objekt ist jedes Element auf 2 Bytes kodiert, aber in QByteArray auf 1 Byte.
Das ist irrelevant - QByteArray ist einfach eine Ansammlung von Bytes, Daten werden auch einfach als Bytes abgespeichert. Wie man sie dann später interpretiert ist etwas anderes.
Ich weiß auch nicht ob QAudioBuffer die Daten in dem Format ausgibt wie Du es wünscht - ich würde auf den ersten Blick sagen dem ist nicht so.
Vielleicht solltest Du mal erklären was Du wirklich vorhast.
-
@Kev_ said in QAudioBuffer in QByteArray umwandeln:
dass die Konvertierung von QAudioBuffer zu QByteArray nicht richtig durchgeführt war. In dem QAudioBuffer Objekt ist jedes Element auf 2 Bytes kodiert, aber in QByteArray auf 1 Byte.
Das ist irrelevant - QByteArray ist einfach eine Ansammlung von Bytes, Daten werden auch einfach als Bytes abgespeichert. Wie man sie dann später interpretiert ist etwas anderes.
Ich weiß auch nicht ob QAudioBuffer die Daten in dem Format ausgibt wie Du es wünscht - ich würde auf den ersten Blick sagen dem ist nicht so.
Vielleicht solltest Du mal erklären was Du wirklich vorhast.
@Christian-Ehrlicher Hello : )
Auf die Werte, die in QAudioBuffer gespeichert sind, möchte ich ein paar Rechnungen anwenden(z. B. filtern).
Mitqint16* raw_data = buffer.data<qint16>();
habe ich Zugriff auf die Daten, die im QAudioBuffer gespeichert sind und kann sie verändern. Das werde ich für meine Filterung benutzen. Am Ende habe ich immer dasselbe QAudioBuffer Objekt, aber jetzt mit meinen Ergebnissen drin.
Das Ergebnis der Rechnung möchte ich in Echtzeit hören und dafür habe ich eine Klasse erstellt, die von QIODevice abgeleitet ist. Das Ergebnis der Rechnung sollte an der readData-Methode meiner abgeleiteten Klasse zu Verfügung stehen, und zwar nicht in einem QAudioBuffer, sondern in einem QByteArray oder ein char*.Ich habe also vor, ein QAudioBuffer mit Format 2 Bytes in einem QByteArray umzuwandeln. Ich habe bis jetzt viel probiert und ich befürchte, dass es nicht möglich ist.
Die Speicherung in einer TXT-Datei ist nur zu überprüfen, ob diese Umwandlung funktioniert.