我目前的代码是:
- 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().帮助赞赏.
解决方法
>必须打开设备(QBuffer):
> 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);
>当声音播放完毕后,您分配的所有内容都应该被释放,否则您将发生内存泄漏,并且事件循环现在将在函数内部运行,因此您可以在本地分配所有内容.