如何使用 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 文件?的主要内容,如果未能解决你的问题,请参考以下文章

Qt on android 播放视频的实现

Qt Multimedia - 如何强制从媒体文件中读取标签

QT按钮如何打开本地视频

Qt 开源音视频框架模块QtAV01:介绍编译以及简单使用

如何创建 Windows GUI 应用程序来播放视频

多媒体(音乐视频播放器,相机)