gpt4 book ai didi

c++ - 如何使用QtMultimedia播放wav文件?

转载 作者:可可西里 更新时间:2023-11-01 18:36:10 24 4
gpt4 key购买 nike

我当前的代码是:

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. 您分配的所有内容都应在声音播放完毕后释放,否则会发生内存泄漏,事件循环现在将在函数内部运行,因此您可以在本地分配所有内容。

关于c++ - 如何使用QtMultimedia播放wav文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10044211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com