【问题标题】:AudioFlinger(59): RecordThread: buffer overflow when Activity is paused?AudioFlinger(59):RecordThread:Activity暂停时缓冲区溢出?
【发布时间】:2011-06-17 06:40:28
【问题描述】:

我有一个应用程序,它包含一个服务和一个可以由服务为某些事件启动的活动。该服务可能会创建和使用 AudioRecord 和 AudioTrack 类 - 此时会显示应用程序的 Activity。问题是如果 Activity 被暂停(即 onPause() 被调用)我开始收到 RecordThread: buffer overflow 错误?

我的猜测是 AudioRecorder 正在主线程中运行。而且,即使它是由服务创建的,当 Activity 暂停读取停止时缓冲区溢出? AudioRecorder 读取是否必须在单独的线程中完成,即使它在服务中运行?

任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: android audio


    【解决方案1】:

    虽然是一个老问题,但我希望我在开始使用服务时就知道这个答案,所以我将其记录下来以供其他人将来参考:

    关于服务的一个经常被忽视但非常重要的一点是,它们不会自动生成自己的线程,而是在主 GUI 线程上运行。在考虑“服务”这个词时,这是非常违反直觉的,但仍然是正确的。 (请参阅http://developer.android.com/guide/topics/fundamentals/services.html 的第一个“警告”部分)。

    您可能还想考虑扩展 IntentService 类而不是 Service 类,后者将“...创建[s]一个执行所有意图的默认工作线程...与您的应用程序的主线程分开。” (http://developer.android.com/guide/topics/fundamentals/services.html)

    希望有人觉得这很有用!

    【讨论】:

      【解决方案2】:

      当您没有足够快地从 AudioRecord 对象中提取数据时,会发生 RecordThread 缓冲区溢出。

      您绝对应该在一个单独的线程中拥有从 AudioRecord 对象中提取数据的循环,并且如果您的活动被暂停,您应该停止该线程(除非您想在后台录制。)

      以下是几个工作实现的示例:

      【讨论】:

      • 谢谢!是的,我想在后台录制
      猜你喜欢
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 2013-11-06
      • 2013-04-11
      • 2015-07-07
      • 2012-02-05
      相关资源
      最近更新 更多