背景
在Android N上使用MediaPlayer进行高频率的音频播放,会出现很严重的声音播放延迟的问题。比如快递业务场景,在业务员正确扫描快递面单后,需要播放一个声音来提示业务员该面单已经扫描完毕,可以进行下一单扫描。业务员也是通过这个声音来作为判断标准,只有在听到声音播放的情况下才会认为这个面单已经录进了系统(出现漏扫漏件是要扣钱的),才敢进行下一个快件的扫描。这个场景需要很高的工作效率,平均每个人每秒钟会扫描3-4个快件,也就是提示的声音每秒钟需要播放3-4次。这种条件背景下,如果代码中使用MediaPlayer去完成这么高频率的音频播放动作,会有很大的问题,声音播放延迟的问题很严重,因为声音播放不及时,会极大的影响业务员的工作效率。(并不是每个平台、每个Android系统都有这个问题,这里讨论的是高通8909 Android N平台)。
问题定位
08-02 18:45:30.834 367 589 D audio_hw_primary: enable_snd_device: snd_device(2: speaker)
08-02 18:45:30.839 367 589 D audio_hw_primary: enable_audio_route: apply mixer and update path: deep-buffer-playback
通过抓取日志分析,发现日志中有大量如上所示的"deep-buffer-playback"的日志信息,这是Android Audio系统播放音频文件最终采取的播放模式。很显然,这些声音的播放都是采取的"deep-buffer-playback"模式。在Android系统上,声音的播放主要有三种模式,分别是low-latency-playback、deep-buffer-playback和co