- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 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()
中作为参数传递)和错误如下所示:
请注意,我在空闲状态下停止audio_out
following this example .为什么代码遇到欠载错误?这正常吗?
最佳答案
这可能看起来有点奇怪,但我已经看到 Qt 中的内置数组在堆上构建时处理得更好,或者至少当它们的元素在堆上构建时(所以它们只是一个数组指针)。内存管理有点棘手,但插入其中的项目不会超出范围。 Qt Object Model还促进将大多数东西放在堆上并正确地养育它们。这可能会有所帮助。
在阅读了一些关于缓冲区欠载的信息后,听起来似乎仍有一些东西在尝试从音频源中读取,而其他东西正在写入它,反之亦然。查看下面的一些链接。在读取缓冲区之前,您可以尝试断开 audio_in 部分与缓冲区的连接。这更有可能修复错误。
我还会在主窗口的构造函数中构造 QAudioOutput 指针(更像是一种样式)。按照 Qt 示例中的一些组织方式,它似乎是一个更好的组织。这是 cpp对于 QAudioInput example .
如果您有一个更完整的示例,我可以尝试更多使用它来重现错误并进行调试。
这里还有一个值得同情的人:
还有一篇维基文章:
以及 Qt 上的多媒体示例列表:
http://doc.qt.nokia.com/4.7-snapshot/examples-multimedia.html
希望对您有所帮助。
关于c++ - QAudioOutput 总是遇到 UnderrunError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9555302/
我在 Windows 7 Ultimate x64 上使用 Qt 4.8 和 Qt Creator 2.4.1。 我正在使用 QAudioInput 类获取音频输入并使用 QAudioOutput 播
我是一名优秀的程序员,十分优秀!