QAudioOutput总是遇到UnderrunError

时间:2012-03-04 13:34:47

标签: c++ qt audio

我在Windows 7 Ultimate x64上使用Qt 4.8和Qt Creator 2.4.1。

我正在使用QAudioInput课程进行音频输入并使用QAudioOutput进行播放。超时2秒后,我停止接收输入,然后按如下方式设置输出:

class MainWindow
{
    // ...

    QByteArray output_data;
    QBuffer output_data_buffer;
    QAudioOutput *audio_out;

    // ...
};

MainWindow::MainWindow(QWidget *parent)
{
    // ...

    output_data_buffer.setBuffer(&output_data);

    // ...
}

void MainWindow::audioInputStopped(QByteArray data)
{
    output_data = data;
    output_data_buffer.open(QIODevice::ReadOnly);
    audio_out = new QAudioOutput(audio_format, this);
    connect(audio_out, SIGNAL(stateChanged(QAudio::State)), 
            SLOT(audioOutputStateChanged(QAudio::State)));
    audio_out->start(&output_data_buffer);
}

输入和输出设备都支持我正在使用的音频格式。我使用QAudioDeviceInfo::isFormatSupported()检查了它们。 <2}音频(data中的audioInputStopped())始终可以正常播放。

在插槽audioOutputStateChanged中,我在缓冲区播放完毕后总是遇到来自QAudio::UnderrunError的{​​{1}}错误。调用audio_out->error()后,状态(作为audio_out->start()中的参数传递)和错误如下:

  1. 没有错误。活跃的状态。
  2. 没有错误。停止状态。
  3. 欠载错误。空闲状态。
  4. 请注意,我在空闲状态following this example停止audioOutputStateChanged()。为什么代码遇到欠载错误?这是正常的吗?

1 个答案:

答案 0 :(得分:1)

这看起来有点奇怪,但是我已经看到Qt中的内置数组在堆上构造时处理得更好,或者至少当它们的元素在堆上构造时(因此它们只是一个数组)指针)。内存管理有点棘手,但推入它们的项目不会超出范围。 Qt Object Model还促进将大部分内容放在堆上并正确地为它们提供父级。这可能有所帮助。

稍微读了一下缓冲区欠载后,听起来有些东西仍然试图从音频源读取而其他东西正在写入它,反之亦然。看看下面的一些链接。您可以尝试在读取缓冲区之前断开audio_in部分与缓冲区的连接。这更有可能解决错误。

我还会在主窗口的构造函数中构造你的QAudioOutput指针(更像是一个样式的东西)。根据Qt中的示例组织的一些方式,它似乎是一个更好的组织。以下是cppQAudioInput example

如果您有更完整的示例,我可以尝试使用它来重新创建错误并进行调试。

以下是其他人同情:

  

http://qt-project.org/forums/viewthread/16729

还有一篇wiki文章:

  

http://en.wikipedia.org/wiki/Buffer_underrun

Qt上的多媒体示例列表:

  

http://doc.qt.nokia.com/4.7-snapshot/examples-multimedia.html

希望有所帮助。