【问题标题】:Android: Precise timing to play audioAndroid:播放音频的精确时间
【发布时间】:2012-04-15 21:39:53
【问题描述】:

我正在编写一个使用录制样本(使用 SoundPool)播放音乐的 Android 应用程序。我有一个播放器,可以根据当前时间(realTimeElapsed)检查我必须播放哪些样本。播放器使用我设置为 1 毫秒的计时器进行更新。大多数时候这工作正常,但有时我有大约 100 毫秒的延迟。

我找不到增加计时器优先级的方法,有没有其他方法可以解决这些延迟?

我同时使用 openGL 渲染场景,但如果我禁用所有绘图,我会得到相同的延迟。

谢谢

编辑:

我使用 TraceView 对其进行了分析:音频线程 (Thread-16) 每毫秒执行一次。但是在 t=2580 时有大约 200 毫秒的中断。在此期间线程没有处于睡眠状态,而是在 SoundPool.play 方法中并被中断。每次我有这样的延迟时,音频线程都会被中断。没有办法防止这些中断吗?

我已将 GL 线程(中断音频线程)的优先级设置为 THREAD_PRIORITY_LOWEST。

右键单击图像并选择“显示图像”或类似的选项以全分辨率查看图像。

【问题讨论】:

  • 200 毫秒听起来有点大。是否有可能是由于垃圾收集造成的?发生垃圾回收时,会向 logcat 打印一条消息。只需确保它是来自您的进程的消息,而不是其他随机进程。
  • 此时没有GC运行,你会在TraceView中看到GC。在这 200 毫秒内,OpenGL 线程一直在运行(请右键单击图像并选择“显示图像”或附近的选项以全分辨率查看图像)
  • 肯定是Soundpool的问题,如果我不调用SoundPool的play方法,我一点延迟都没有。我将不得不为这个问题打开一个新线程

标签: android audio timer


【解决方案1】:

我建议尝试Handler.postDelayed() 而不是 Timer,看看你是否能得到更好的结果。

如果不是,也许只是一个带有短 Thread.Sleep() 的线程,并检查 System.nanoTime()

【讨论】:

  • 您好,感谢您的回答。我都尝试了,但没有真正成功:使用 Handler.postDelayed 与 Timer 大致相同;我目前正在使用自己的高优先级线程并睡眠一毫秒,但我仍然会延迟约 100 毫秒...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
相关资源
最近更新 更多