我目前的代码是:
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()。帮助赞赏。
答案 0 :(得分:6)
必须打开设备(QBuffer
):
QBuffer audio_buffer(&audio_data);
audio_buffer.open(QIODevice::ReadOnly);
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);
当声音播放完毕后,您分配的所有内容都应该被释放,否则您会发生内存泄漏,并且事件循环现在将在函数内部运行,因此您可以在本地分配所有内容。
< / LI> 醇>