我在Qt论坛上发布了这个问题,但没有得到答案.这就是我在这里发布它的原因.
我想知道有没有办法在Qt同时录制和播放声音.我想录制麦克风的声音,同时我想在扬声器/耳机中播放声音.
在Qt有什么办法吗?或者我需要使用任何其他库吗?
如果解决方案是跨平台的(我需要覆盖windows,linux和mac),那将是很棒的.如果不可能,那么Linux解决方案就可以了.
我顺便使用Qt 4.7.
编辑
我的最新实施在这里给出.我创建了QIODevice的子类并重新实现了writeData和readData方法,以便可以使用循环缓冲区进行读写.我按照这个建议做了这个.此代码也不起作用,因为QAudioOutput实例面临Underrun Error,根据此文档意味着 -
音频数据没有以足够快的速率馈送到音频设备
我已经应用了一个黑客来暂时解决这个问题.在该outputStateChanged方法中,我正在检查输出的状态是否已更改为IDLE,如果有,我再次调用start()方法,指定公共缓冲区.我不想将此作为永久解决方案,因为它感觉非常hacky,因为我在没有正确调查其原因的情况下吞下错误.
我该怎么做才能解决这个问题?
我也试图用Phonon来解决这个问题,但是因为我对这个模块没有足够的了解而失败了.
我不是非常有经验的使用Qt,但我与处理媒体,所以原谅我,如果我的回答是不是很具体,而是从一个更普遍一点解决您的问题.
我查看了你的代码,我认为一般来说你的想法应该有效.我看到了一些问题:
该writeData方法似乎没有准备好处理缓冲区满状态.当循环缓冲区填充它时,它只会覆盖旧数据,并错误地继续增加currentBufferLength变量.我认为在这里做的正确的事情是更新readPosition以跳过丢失的数据,并防止currentBufferLength不断增长超过缓冲区大小.
你几乎在同一时间开始作家和读者.相反,您应该启动编写器并填充循环缓冲区,然后启动阅读器.请记住,您将永远无法以零延迟进行录制和播放.至少,你的等待时间将是一个单独的缓冲区写入的大小,但在实践中,你可能需要作家由几个缓冲区提前,以避免打嗝.
您应该分别调试阅读器和编写器.仅设置编写器并验证是否定期写入循环缓冲区(首先按照我的建议修复溢出条件).要进行调试,可以将缓冲区转储到文件中,然后在音频播放器(例如Audacity)中检查文件,或者可以使用printf调试来确保始终获取数据.然后只用一个读者做类似的事情.
最后的想法.调用你readData和writeData方法的代码可能正在其他线程上运行,可能是两个不同的线程,一个用于读者,另一个用于编写器.如果我的猜测是正确的,那么你的圆形结构就会出现很大的问题.您必须保护对确定读写位置和大小的变量的访问,否则您将有竞争条件.
祝好运.