2012-04-06 134 views
7

我當前的代碼是:如何使用QtMultimedia播放wav文件?

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); 
    } 
} 

這整個事情的開始是在一個QThreadPool和QRunnable那部分工作正常。問題是我從來沒有得到任何音頻。我的聲音設備正在運行,緩衝區已滿。我不知道什麼是錯的。我使用app.exec()。幫助讚賞。

回答

5
  1. 設備(QBuffer)必須是開放的:

    QBuffer audio_buffer(&audio_data);   
    audio_buffer.open(QIODevice::ReadOnly); 
    
  2. QAudioOutput需要一個事件循環播放什麼,以及環在其所屬的線程中運行。這是它的創建線程,當你不明確將其移動到另一個線程:當聲音播放完畢後你分配

    // 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. 一切都應該被釋放,或者你將有一個內存泄漏,並事件循環現在將在函數內部運行,因此您可以在本地分配所有內容。