2012-04-06 11 views
7

Mein aktueller Code ist:Wie verwende ich QtMultimedia, um eine WAV-Datei abzuspielen?

void Sound::run() { 
    QFile audio_file(mResourcePath); 
    if(audio_file.open(QIODevice::ReadOnly)) { 
     audio_file.seek(44); // skip wav header 
     QByteArray audio_data = audio_file.readAll(); 
     audio_file.close(); 

     QBuffer* audio_buffer = new QBuffer(&audio_data); 
     qDebug() << audio_buffer->size(); 

     QAudioFormat format; 

     format.setSampleSize(16); 
     format.setSampleRate(44100); 
     format.setChannelCount(2); 
     format.setCodec("audio/pcm"); 
     format.setByteOrder(QAudioFormat::LittleEndian); 
     format.setSampleType(QAudioFormat::UnSignedInt); 

     QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); 
     if (!info.isFormatSupported(format)) { 
      qWarning()<<"raw audio format not supported by backend, cannot play audio."; 
      return; 
     } 
     qDebug() << info.deviceName(); 

     QAudioOutput* output = new QAudioOutput(info, format); 
     output->start(audio_buffer); 
    } 
} 

Das Ganze wird als QRunnable in einem QThreadPool gestartet und das Teil funktioniert gut. Problem ist, dass ich nie Audio bekomme. Mein Soundgerät ist betriebsbereit, der Puffer ist voll. Ich weiss nicht, was falsch ist. Ich benutze app.exec(). Hilfe geschätzt.

Antwort

5
  1. Vorrichtung (QBuffer) hat, offen sein:

    QBuffer audio_buffer(&audio_data);   
    audio_buffer.open(QIODevice::ReadOnly); 
    
  2. QAudioOutput eine Ereignisschleife braucht nichts zu spielen, und dass Schleife hat im Faden zu laufen es gehört. Welches ist der Thread erstellt wurde, wenn Sie nicht explizit auf einem anderen Thread verschieben:

    // Create the device and start playing... 
    QAudioOutput output(info, format); 
    output.start(&audio_buffer);  
    
    // ...then wait for the sound to finish 
    QEventLoop loop; 
    QObject::connect(&output, SIGNAL(stateChanged(QAudio::State)), &loop, SLOT(quit())); 
    do { 
        loop.exec();    
    } while(output.state() == QAudio::ActiveState);   
    
  3. Alles, was Sie zuweisen soll freigegeben werden, wenn der Ton wiedergegeben wird, oder würden Sie einen Speicherverlust haben, und Die Ereignisschleife wird nun innerhalb der Funktion ausgeführt, sodass Sie alles lokal zuweisen können.

Verwandte Themen