Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. QAudioBuffer in QByteArray umwandeln

QAudioBuffer in QByteArray umwandeln

Scheduled Pinned Locked Moved Unsolved German
5 Posts 2 Posters 612 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • K Offline
    K Offline
    Kev_
    wrote on last edited by
    #1

    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();
    }
    
    1 Reply Last reply
    0
    • Christian EhrlicherC Offline
      Christian EhrlicherC Offline
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Da es binärdaten sind sollte man sie nicht als text (QTextStream) behandeln sondern als binärstream -> QFile::write()

      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
      Visit the Qt Academy at https://academy.qt.io/catalog

      K 1 Reply Last reply
      1
      • Christian EhrlicherC Christian Ehrlicher

        Da es binärdaten sind sollte man sie nicht als text (QTextStream) behandeln sondern als binärstream -> QFile::write()

        K Offline
        K Offline
        Kev_
        wrote on last edited by
        #3

        @Christian-Ehrlicher Danke für Ihre Meldung.
        Ich habe im Code die for-Schleife durch Folgendes ersetzt, file.write(buffer_ByteArray); . Ich ahbe auch mit file.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 ich QByteArray 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 EhrlicherC 1 Reply Last reply
        0
        • K Kev_

          @Christian-Ehrlicher Danke für Ihre Meldung.
          Ich habe im Code die for-Schleife durch Folgendes ersetzt, file.write(buffer_ByteArray); . Ich ahbe auch mit file.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 ich QByteArray 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 EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @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.

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          K 1 Reply Last reply
          0
          • Christian EhrlicherC Christian Ehrlicher

            @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.

            K Offline
            K Offline
            Kev_
            wrote on last edited by Kev_
            #5

            @Christian-Ehrlicher Hello : )

            Auf die Werte, die in QAudioBuffer gespeichert sind, möchte ich ein paar Rechnungen anwenden(z. B. filtern).
            Mit qint16* 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.

            1 Reply Last reply
            0

            • Login

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups
            • Search
            • Get Qt Extensions
            • Unsolved