c语言输入q自动退出,C语言 QAudioOutput总是遇到UnderrunError

我在

Windows 7旗舰版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()中的数据)始终可以正常播放.

在插槽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

希望有所帮助.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值