gpt4 book ai didi

c++ - QAudioOutput 总是遇到 UnderrunError

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:19:24 30 4
gpt4 key购买 nike

我在 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 秒音频(audioInputStopped() 中的data)始终播放正常。

在插槽 audioOutputStateChanged 中,我总是遇到 audio_out->error() 缓冲区后的 QAudio::UnderrunError 错误玩完了。 audio_out->start() 被调用后,状态(在 audioOutputStateChanged() 中作为参数传递)和错误如下所示:

  1. 没有错误。活跃状态。
  2. 没有错误。停止状态。
  3. 欠载错误。空闲状态。

请注意,我在空闲状态下停止audio_out following this example .为什么代码遇到欠载错误?这正常吗?

最佳答案

这可能看起来有点奇怪,但我已经看到 Qt 中的内置数组在堆上构建时处理得更好,或者至少当它们的元素在堆上构建时(所以它们只是一个数组指针)。内存管理有点棘手,但插入其中的项目不会超出范围。 Qt Object Model还促进将大多数东西放在堆上并正确地养育它们。这可能会有所帮助。

在阅读了一些关于缓冲区欠载的信息后,听起来似乎仍有一些东西在尝试从音频源中读取,而其他东西正在写入它,反之亦然。查看下面的一些链接。在读取缓冲区之前,您可以尝试断开 audio_in 部分与缓冲区的连接。这更有可能修复错误。

我还会在主窗口的构造函数中构造 QAudioOutput 指针(更像是一种样式)。按照 Qt 示例中的一些组织方式,它似乎是一个更好的组织。这是 cpp对于 QAudioInput example .

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

这里还有一个值得同情的人:

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

还有一篇维基文章:

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

以及 Qt 上的多媒体示例列表:

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

希望对您有所帮助。

关于c++ - QAudioOutput 总是遇到 UnderrunError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9555302/

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