【问题标题】:AudioRecord failing after 48 hours48 小时后录音失败
【发布时间】:2013-11-25 13:30:14
【问题描述】:

我正在启动一个简单的音频记录实例,并以 44.1kHz 的频率从缓冲区(minbufsize 的 10 倍)读取,平均为 441Hz,这对于 48 小时的录音来说很好。

在 48 小时后的某个随机时间,recoredr 停止(而不是崩溃)并显示消息

E/AudioFlinger(128): TrackBase::getBuffer 缓冲区超出范围: E/AudioFlinger(128):开始:0x42242844,结束0x42256044,mBuffer 0x4224c044 mBufferEnd 0x42256044 E/AudioFlinger(128):服务器-3072,服务器基础16384,用户-4096,用户基础-4096 W/AudioFlinger(128):RecordThread:缓冲区溢出

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

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

应用程序按预期运行。

48 小时后我看不到问题出在哪里,我不能强迫问题在更短的时间范围内重复,以便我可以调试。帮忙!

【问题讨论】:

  • 可能有一个或多个内部使用的 32 位计数器在未正确处理的情况下回绕。
  • 嗨,迈克尔。谢谢 - 它确实看起来像这样。 2^32= 4.29497e+09 并且在长计数器达到 4.2949397E7 后程序失败。每次这个长计数器增加 1 时,就有一个 100 循环,但没有使用计数器...
  • 但我每次都在创建一个简短的 [100]。这可能是内存泄漏吗?
  • 迈克尔,谢谢,你是对的。录音机必须有一个内部 32 位计数器。它不在我的代码中,但通过偶尔关闭和重新打开 Audiorecorder 来解决。

标签: android buffer-overflow audiorecord


【解决方案1】:

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

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

  • 如果 curPos 持续时间 > 6 小时且系统时间为早上 06:00,则重新启动流。目前没有人在收听直播,所以几秒钟的故障无关紧要。
  • 如果 curPos 持续时间 > 40h 然后重新启动流,在 06:00 时间被跳过的情况下进行故障保护
  • 如果 curPos==prevPos 则 watchdogCounter++ 否则 watchdogCounter=0
  • 如果 watchdogCounter>3 则重新启动停止的流

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2022-10-25
    • 2018-11-24
    相关资源
    最近更新 更多