c – 如何使用QtMultimedia播放wav文件?

前端之家收集整理的这篇文章主要介绍了c – 如何使用QtMultimedia播放wav文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前的代码是:
  1. void Sound::run() {
  2. QFile audio_file(mResourcePath);
  3. if(audio_file.open(QIODevice::ReadOnly)) {
  4. audio_file.seek(44); // skip wav header
  5. QByteArray audio_data = audio_file.readAll();
  6. audio_file.close();
  7.  
  8. QBuffer* audio_buffer = new QBuffer(&audio_data);
  9. qDebug() << audio_buffer->size();
  10.  
  11. QAudioFormat format;
  12.  
  13. format.setSampleSize(16);
  14. format.setSampleRate(44100);
  15. format.setChannelCount(2);
  16. format.setCodec("audio/pcm");
  17. format.setByteOrder(QAudioFormat::LittleEndian);
  18. format.setSampleType(QAudioFormat::UnSignedInt);
  19.  
  20. QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
  21. if (!info.isFormatSupported(format)) {
  22. qWarning()<<"raw audio format not supported by backend,cannot play audio.";
  23. return;
  24. }
  25. qDebug() << info.deviceName();
  26.  
  27. QAudioOutput* output = new QAudioOutput(info,format);
  28. output->start(audio_buffer);
  29. }
  30. }

整个过程在QThreadPool中作为QRunnable启动,该部分工作正常.问题是我从来没有得到任何音频.我的声音设备正常运行,缓冲区已满.我不知道出了什么问题.我使用app.exec().帮助赞赏.

解决方法

>必须打开设备(QBuffer):
  1. QBuffer audio_buffer(&audio_data);
  2. audio_buffer.open(QIODevice::ReadOnly);

> QAudioOutput需要一个事件循环来播放任何东西,并且该循环必须在它所属的线程中运行.当您没有将其显式移动到另一个线程时,它是创建的线程:

  1. // Create the device and start playing...
  2. QAudioOutput output(info,format);
  3. output.start(&audio_buffer);
  4.  
  5. // ...then wait for the sound to finish
  6. QEventLoop loop;
  7. QObject::connect(&output,SIGNAL(stateChanged(QAudio::State)),&loop,SLOT(quit()));
  8. do {
  9. loop.exec();
  10. } while(output.state() == QAudio::ActiveState);

>当声音播放完毕后,您分配的所有内容都应该被释放,否则您将发生内存泄漏,并且事件循环现在将在函数内部运行,因此您可以在本地分配所有内容.

猜你在找的C&C++相关文章