1

我正在使用 android.media.AudioRecord 获取原始音频输入,然后我正在实时处理它以显示即时反馈。我可以调整各种加工参数来改变反馈的质量,相应地改变加工时间。

随着我增加处理时间,在某些时候 AudioRecord 开始溢出并且 read() 开始丢失数据块。除了显示的显着变化外,我在 LogCat 中收到以下消息(我正在使用 eclipse 进行调试):“E/AudioHardwareYamaha(2579): snd_pcm_readi read error -32”

我的应用程序如何发现此错误?调试时发现还不够好,我希望应用知道何时发生这种情况,以便它可以自动调整参数,找到质量尽可能高但溢出消失或不经常出现的最佳位置。我认为这个甜蜜点在不同的硬件上会有所不同。

我已经检查过这里和其他地方,但我发现的建议不足:

  • 将缓冲区大小增加到某个小的倍数以上并不是解决方案,因为它只会推迟不可避免的故障(并增加反馈的延迟)。

  • 我看到了将读取和处理放在单独的线程中的建议。基本上这相当于 AudioRecord 的包装器,增加了大量的复杂性和更多的处理,只是为了进行我自己的错误检测。我的应用程序基本上完成了,如果可以避免的话,我真的不想重构所有内容。

  • 根据预期检查经过的时间似乎是目前最可行的解决方案,但我不得不采用这种间接策略来猜测 AudioRecord 做了什么(并记录了),这似乎很奇怪。

应用程序是否有一种简单的方法来捕获正在记录的错误信息?

4

1 回答 1

1

只是为了回答我自己的问题,以防有人偶然发现这个......

我无法找到一个好的解决方案,但我一直在使用解决方法。我最终使用了时钟,而不是音频输入硬件。因为我知道我的输入缓冲区有多大,我知道每秒有多少输入样本,并且我可以从系统时钟找到我的代码运行速度有多快,所以我可以计算何时应该发生溢出,并编写我的代码周围。

不完全是我所希望的,但它完成了我所需要的。

于 2013-09-23T15:47:24.790 回答