如何使用QtMultedia播放wav文件

How to use QtMultimedia to play a wav file?

本文关键字:wav 文件 播放 QtMultedia 何使用      更新时间:2023-10-16

我当前的代码是:

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);
    
  2. 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);        
    
  3. 当声音播放完毕时,您分配的所有内容都应该被释放,否则会出现内存泄漏,并且事件循环现在将在函数内部运行,因此您可以在本地分配所有内容。