【问题标题】:QAudioOutput in Qt5 is not producing any soundQt5 中的 QAudioOutput 不产生任何声音
【发布时间】:2013-03-13 17:12:06
【问题描述】:

我在 kubuntu 12.10 下工作并开发一个应用程序,我需要在其中生成一些声音到 QIODevice 中,然后使用 QAudioOutput 播放它。

我已经阅读了所有关于如何正确做到这一点的文献,我认为已经这样做了。

到目前为止,我已经完成了:

QVector <double> * soundData = SoundGenerator::getSound();

soundBuffer->open(QIODevice::ReadWrite);
QDataStream writeStream(soundBuffer);
foreach(double d, *soundData) {
    char value = d * (2 << 7);
    //  qDebug() << "Value : " << (short int)value;
    writeStream << value;
}

QAudioFormat format;
// Set up the format, eg.
format.setSampleRate(SoundGenerator::getAudioSampleRate());
format.setChannelCount(1);
format.setSampleSize(8);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());

audio = new QAudioOutput(format, this);
if (audio->error() != QAudio::NoError) {
    qDebug() << "Problem playing sound";
}

connect(audio, SIGNAL(stateChanged(QAudio::State)), this, SLOT(aboutToFinish(QAudio::State)));

我还有一个电话 音频->开始(声音缓冲区)

—— 从另一个插槽 我在 QAudioOutput 的初始化中没有任何错误

而且我根本没有声音(所有其他应用程序都有声音,我正在将 Qt4 应用程序移植到 Qt5,在 Qt4 中,使用 Phonon 一切正常)

aboutToFinish 插槽在开始时以 ActiveState 作为状态调用,在调用 QAudioOutput::error 时调用 NoError,但它不再被调用,即使等待的时间远远超过预期的生成声音持续时间。

声音生成过程不用多说,写wav文件测试过,可以用。

此外,我已经从 Qt 的源代码构建了多媒体示例,当涉及到纯音频时,没有输出(例如在 sprectrum 示例中),另一方面,视频可以完美地播放声音。

是否有任何已知问题?那是一个错误吗?我是不是做错了什么?

提前致谢;)

【问题讨论】:

  • 你给QAudioDeviceInfo::supportedCodecs() const打过电话吗?我很欣赏所有平台都应该支持"audio/pcm",但这里的关键字是应该...
  • 嗨,我已经调用它并且音频/pcm 在支持的编解码器列表中
  • sudo apt-get install libqt5multimedia5-plugins stackoverflow.com/questions/21939759/…

标签: qt


【解决方案1】:

这不起作用,因为您设置了 8 位样本大小和有符号整数格式。

解决方案:对于 8 位分辨率,您必须将样本类型设置为无符号:

format.setSampleType(QAudioFormat::UnsignedInt);

这不是 Qt 错误。为什么?答案是在 WAV 规范中,8 位样本总是无符号的,而 16 位样本总是有符号的。任何其他组合都不起作用。

因此,对于 16 位样本,您必须输入:

format.setSampleType(QAudioFormat:SignedInt);

(恕我直言,Qt 没有通过强制使用正确的格式来处理这些情况,这是一个缺陷,但并非缺乏功能)。

您可以在本页的注释部分了解更多信息:https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

还有这个非常相似的问题的解决方案(同样的问题,但使用 16 位):Qt QAudioOutput push mode

【讨论】:

    【解决方案2】:

    尝试添加:

    QEventLoop loop;

    loop.exec();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多