播放的相对延迟,pausing/stopping,以及 Android 中的音频设置音量

Relative latency of playing, pausing/stopping, and setting volume of audio in Android

我的问题是关于播放的相对延迟,pausing/stopping,以及在 Android 中设置音频的音量。具体来说:pause/stop 音频剪辑的延迟是否与播放它相同或更低,同样,设置剪辑音量(或系统音量)的延迟是否与播放它相同或更低.

对于上下文,假设在 Android 中播放音频剪辑的延迟为 150 毫秒,即 SoundPool.play 在 T=0 分钟执行,最终用户在 T=150 毫秒听到声音。

在T=200m,程序执行SoundPool.pause。如果暂停延迟也是 150m,这意味着最终用户在听到 200m 的剪辑后,直到 T=350m 才会听到暂停。但是,如果暂停延迟为 50 米,那么声音将在 T=250 米时停止,而最终用户只走了 100 米。

显然延迟在设备之间不是恒定的、精确的或一致的,所以更准确地说,我真正想问的是 Android 是否使用单独的途径或技术来 pause/stop /更改音频的音量(特定于程序的音量或系统范围的音量),本质上比播放音频的方式具有更低的延迟。

设置 Play 需要更多时间,因为它必须初始化播放,以下操作需要路径

  1. 找到媒体文件的MIME类型,这需要解析媒体格式并寻找特定的文件头
  2. 初始化音频解码器(通常是硬件),OMX解码器必须加载到内存中
  3. 设置缓冲区说在解析器中分配 10 个缓冲区,在解码器中分配 10 个缓冲区。
  4. 设置解析器和解码器与播放音频设备(扬声器)之间的路径
  5. 播放发生在这一步,数据从解析器缓冲区流向解码器缓冲区,当解码器缓冲区已满时,OMX(解码器框架)将通知播放器引擎,引擎将缓冲区数据传递给 AudioManager -> AudioTrack 等
  6. 解码器将再次处理来自解析器缓冲区的数据,此过程一直持续到 EOF 或用户按下 pause/stop

在暂停期间,延迟应该比播放低得多,因为只有数据交换暂停,但不会释放缓冲区。

在stop buffer被释放的过程中,播放器也被释放,所以如果用户需要再次播放,需要做同样的过程才能再次播放。

音量调高调低就是简单的调用AudioManager来调整通话音量。所以它的延迟应该低于play/stop