AudioRecord在48小时后失败

时间:2013-11-25 13:30:14

标签: android buffer-overflow audiorecord

我正在启动一个简单的audiorecord实例,并从44.1kHz的缓冲区读取(10次minbufsize),平均为441 Hz,这对于48小时的录制来说是好的。

48小时后的一些随机时间,记录器停止(而不是崩溃)消息

E / AudioFlinger(128):TrackBase :: getBuffer缓冲区超出范围: E / AudioFlinger(128):start:0x42242844,end 0x42256044,mBuffer 0x4224c044 mBufferEnd 0x42256044 E / AudioFlinger(128):server -3072,serverBase 16384,user -4096,userBase -4096 W / AudioFlinger(128):RecordThread:缓冲区溢出

我认为操作系统可能正在检查某些内容并且缓冲区溢出,但是当我将循环放在较小的缓冲区中以尝试使其失败时,我得到的只是警告

W / AudioFlinger(128):RecordThread:缓冲区溢出

并且应用程序按预期继续进行。

48小时后我看不出有什么问题,我不能强迫问题在更短的时间内重复,所以我可以调试。帮助!

1 个答案:

答案 0 :(得分:0)

很棒的问题和评论。我将audioplayer 24h / 7d作为前台服务运行,但两天后停止工作。 Mediaplayer没有抛出userlevel异常,没有触发onError,player.isRunning()返回true。这是adb logcat显示 AudioFlinger TrackBase :: getBuffer缓冲区超出范围,它给了我谷歌关键字。

我的解决方案是运行预定的看门狗10秒间隔工作人员任务。任务读取player.getCurrentPosition()毫秒,然后

  • 如果curPos持续时间> 6h AND systime 06:00在早上然后重启流。此时没有人在听流,所以几秒钟的故障并不重要。
  • 如果curPos持续时间> 40h然后重启流,在06:00时间被跳过的故障保护
  • 如果curPos == prevPos则watchdogCounter ++ else watchdogCounter = 0
  • 如果watchdogCounter> 3然后重新启动停滞的流

这种简单的业务逻辑具有魔力。我的设备是华为智能手机Android 2.3.6