为了更好的理解Android音频延迟产生的原因,最好将总的环路延迟分为以下两个部分:
应用延迟
这包括Andorid应用本身、应用程序框架以及第三方或原生API,如OpenSL ES。为了降低延迟,Android开发者应该谨记以下原则:
必要的处理
最大限度缩短输入延迟时间
本部分的建议有助于您在使用内置麦克风或外部耳机麦克风录音时缩短音频输入延迟时间。
AudioManager#PROPERTY_OUTPUT_SAMPLE_RATE
AudioManager#PROPERTY_OUTPUT_FRAMES_PER_BUFFER
验证应用是否使用低延迟音轨
adb shell ps | grep your_app_name
adb shell dumpsys media.audio_flinger
最大限度缩短预热延迟时间
第一次将音频数据加入队列时,设备音频电路需要少量但仍不短的一段时间来预热。为了避免这种预热延迟,可以将无声音频数据的缓冲区加入队列,这能够有效的提升音频性能。
系统延迟
Android系统是所有驱动程序所在的地方,这些不能由应用程序开发人员直接修改。
对于系统中延迟的根本原因,存在许多误解。它们通常被认为与硬件相关、Linux 音频相关或 ALSA 驱动程序相关。
其中一大原因在于ALSA和AudioFlinger的通信方式。具体来说AudioFlinger将音频缓冲区“推送”到 ALSA。“推送”会导致调度问题,从而无法保证音频质量。所有专业音频、低延迟系统都使用“拉”机制。
开发者能做什么?
不可否认的是,在系统层面的东西开发者确实很被动。虽然开发人员不能直接影响 Android 音频延迟,但他们可以游说 OEM 和设备制造商降低音频延迟,或者跟他们合作,以使用他们的内部API,这些API能够提供优秀的音频延迟性能,比如华米OV跟一些大公司有相关合作。
-- END --