随着 Android 6.0 Marshmallow 的部署,华为 Nexus 6P 的往返音频延迟大大改善了 18 毫秒,HTC Nexus 9 的时钟延迟为 15 毫秒。在上一篇文章中提到,10毫秒以内的环路延迟才能被称为专业音频。
一秒的往返音频延迟听起来简直是永恒,250毫秒仍然很糟糕,100 毫秒是一秒的 10%,听起来仍然不可接受。在 25 毫秒时,感觉还可以接受。除非你是电影Whiplash中严格的爵士乐教练 Terence Fletcher,否则10 毫秒应该被视为瞬间。
经过测试,HTC Nexus 9的延迟还是没有达到10毫秒的标准,但14毫秒显示了Android在专业音频处理上取得的令人惊叹的进步。
Android 6.0 Marshmallow的变化
在Android 6.0上,Google对音频线程调度方面进行了改进,从而允许使用更小的缓冲区便能够正常进行工作,这意味着更低的延迟。
但是,Android多媒体服务看起来在Android 6.0上并没有显著的改变。Audio Flinger依然使用“Push”的方式工作。
要及时了解最新的 Android 音频延迟改进,您应该了解以下几点:
音频链路 | 例子 |
---|---|
音频从内建的麦克风输入,内建扬声器输出 | 你手上的手机 |
音频从内建麦克风输入,耳机输出 | 连上耳机的手机,可能你在玩K歌APP |
音频从耳麦输入,耳机输出 | 连上带耳麦耳机的手机 |
USB和MIDI外置设备 | 外置声卡 |
可能你会觉得这些链路看起来都差不多,但事实上并非如此,这几个链路在Android音频延迟上表现出了极大的差异。
音频链路 | HTC Nexus 9最佳环路音频延迟 (Android 6.0) |
---|---|
音频从内建的麦克风输入,内建扬声器输出 | 26毫秒 |
音频从内建麦克风输入,耳机输出 | 14毫秒 |
音频从耳麦输入,耳机输出 | 14毫秒 |
USB和MIDI外置设备 | 无法测试 |
从测试结果来看,内建麦克风的延迟比外置的大得多,为什么会出现这种差异?
内置麦克风上的额外音频延迟
几乎所有的Android设备内建麦克风都会对音频进行额外的处理,以获得更好的音频质量、更好地分离扬声器和背景噪音,并减少回声。
当我们使用外置麦克风时,Android系统会跳过这种处理,从而极大降低延迟。
检测耳机是否接入
对于Android 5.0及以上的系统,提供了一个耳机接入监测的API,但是我们仍然无法知道用户接入的是什么设备,所以我们无法利用这个API针对不同的场景进行不同的音频延迟处理。
关闭内置麦克风效果处理
目前无法知道有哪些设备支持关闭这些效果,我们在使用OpenSL ES的时候可以尝试设置以下标记,这样就能跳过音频效果处理,从而获得低延迟。
SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION
低延迟标志
表示该设备支持45毫秒或更短的稳定输出延迟时间。
val hasLowLatencyFeature: Boolean = packageManager.hasSystemFeature(PackageManager.FEATURE_AUDIO_LOW_LATENCY)
Android高性能音频特性
表示该设备支持20毫秒或更短的稳定往返延迟。
val hasProFeature: Boolean = packageManager.hasSystemFeature(PackageManager.FEATURE_AUDIO_PRO)
-- END --