我正在使用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()中的数据)始终可以正常播放.
在插槽audioOutputStateChanged中,我总是在缓冲区完成播放后遇到来自audio_out-> error()的QAudio :: UnderrunError错误.在调用audio_out-> start()之后,状态(作为audioOutputStateChanged()中的参数传递)并且错误如下:
>没有错误.活跃的状态.
>没有错误.停止状态.
>欠载错误.空闲状态.
请注意,我在空闲状态following this example中停止audio_out.为什么代码遇到欠载错误?这是正常的吗?
解决方法 这看起来有点奇怪,但我已经看到Qt中的内置数组在堆上构造时处理得更好,或者至少当它们的元素在堆上构造时(因此它们只是一个指针数组).内存管理有点棘手,但推入它们的项目不会超出范围. Qt Object Model还促进将大部分内容放在堆上并正确地为它们提供父级.这可能有所帮助.稍微阅读缓冲区欠载后,听起来有些东西仍然试图从音频源读取而其他东西正在写入它,反之亦然.看看下面的一些链接.您可以尝试在读取缓冲区之前断开audio_in部分与缓冲区的连接.这更有可能解决错误.
我还将在主窗口的构造函数中构造您的QAudioOutput指针(更像是样式事物).根据Qt中的示例组织的一些方式,它似乎是一个更好的组织.这是QAudioInput example的cpp.
如果你有一个更完整的例子,我可以尝试更多它来重新创建错误并进行调试.
这是其他人同情:
07003
还有一篇wiki文章:
07004
以及Qt上的多媒体示例列表:
07005
希望有所帮助.
总结以上是内存溢出为你收集整理的c – QAudioOutput总是遇到UnderrunError全部内容,希望文章能够帮你解决c – QAudioOutput总是遇到UnderrunError所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)