首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用QtMultimedia播放wav文件?

如何使用QtMultimedia播放wav文件?
EN

Stack Overflow用户
提问于 2012-04-06 21:33:13
回答 1查看 5.5K关注 0票数 8

我当前的代码是:

代码语言:javascript
复制
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()。感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-07 06:36:54

  1. 设备(QBuffer)必须打开:

audio_buffer.open(QIODevice::ReadOnly);

  • QAudioOutput需要一个事件循环来播放任何内容,并且该循环必须在它所属的线程中运行;QBuffer audio_buffer(&audio_data);当您不显式地将它移动到另一个线程时,它就是在其中创建的线程:

//创建设备并开始播放...QAudioOutput output(info,format);output.start(&audio_buffer);// ...then等待声音结束退出循环;QObject::connect(&output,SIGNAL(stateChanged(QAudio::QEventLoop )),&loop,SLOT(stateChanged());do { loop.exec();} while(output.state() == QAudio::ActiveState);

  • 您分配的所有内容都应在声音播放完毕后释放,否则会出现内存泄漏,此时事件循环将在函数内部运行,因此您可以在本地分配所有内容。
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10044211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档