如何使用 QtMultimedia 播放 wav 文件?
Posted
技术标签:
【中文标题】如何使用 QtMultimedia 播放 wav 文件?【英文标题】:How to use QtMultimedia to play a wav file? 【发布时间】:2012-04-06 13:33:13 【问题描述】:我当前的代码是:
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()。帮助表示赞赏。
【问题讨论】:
【参考方案1】:设备 (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);
您分配的所有内容都应在声音播放完毕后释放,否则您会发生内存泄漏,事件循环现在将在函数内部运行,因此您可以在本地分配所有内容。
【讨论】:
以上是关于如何使用 QtMultimedia 播放 wav 文件?的主要内容,如果未能解决你的问题,请参考以下文章