我正在使用android.media.AudioRecord获取原始音频输入,然后我实时处理它以显示即时反馈。我可以调整各种处理参数来改变反馈的质量,并相应地改变处理时间。
随着处理时间的增加,AudioRecord开始溢出,read()开始丢失数据块。除了显示的显着变化,我在LogCat中得到以下消息(我使用eclipse进行调试): “E / AudioHardwareYamaha(2579):snd_pcm_readi读取错误-32”
我的应用如何找到有关此错误的信息?在调试时找不到它是不够的,我希望应用程序知道何时发生这种情况,以便它可以自动调整参数,找到质量尽可能高的最佳点,但溢出消失或不常见。我认为这个甜点在不同的硬件上会有所不同。
我已经在这里和其他地方查了一下,但我发现的建议不足:
将缓冲区大小增加到一些小的倍数不是一个解决方案,因为它只会推迟不可避免的故障(并增加反馈的延迟)。
我已经看到了将读取和处理放在单独的线程中的建议。基本上这相当于AudioRecord的包装器,增加了大量的复杂性和更多的处理,只是为了做我自己的错误检测。我的应用程序基本完成,如果可以避免,我真的不想重构所有内容。
根据预期检查经过的时间似乎是目前最可行的解决方案,但似乎奇怪的是我必须采用这种间接策略来猜测AudioRecord已经做了什么(并记录了)。
应用程序是否有一种简单的方法来捕获正在记录的错误信息?
答案 0 :(得分:0)
只是为了回答我自己的问题,以防有人偶然发现...
我无法找到一个好的解决方案,但我一直在使用解决方法。我最终使用的是时钟,而不是音频输入硬件。因为我知道我的输入缓冲区有多大,而且我知道每秒输入样本的数量,并且我可以发现我的代码从系统时钟运行的速度有多快,我可以计算何时应该发生溢出,并编写我的代码在那附近。
不完全是我所希望的,但它完成了我所需要的。