Android Audio Latency测试
Audio Latency 通常是一个非常棘手的问题,它的核心点在于播放音乐的过程中,如果延迟低就容易发生卡顿;延迟高就比较流畅,但过高的延迟会带来音画同步的问题,用户会感觉慢半拍。所以延迟和流畅就像天平的两端一样,要取舍才能达到平衡。
如何测试延迟非常重要,只有拿到延迟的数据才能进行参数调优
场景1:设备A发送音频数据 -> 通过网络 -> 设备B发声
方法1:
1)首先保证设备A和设备B支持同时发声,不同的设备不同的环境开启手法有差异,或者直接修改底层以支持。在android平台上可以使用 setprop persist.audio.delay.test 1 命令开启。
2)播放特定的打点音乐,如正弦波,这种音乐专门用于测量延迟。可根据图片中的网址自行下载。
3)将两个麦克风连上录音盒,麦克风分别对着设备A和设备B,然后在电脑上打开Audacity软件,查看实时的波峰(或者其他指标),来计算波峰之间的时间差得到的就是延迟。
方法2:
如果没有录音盒,在方法一的基础上也可以用手机拍摄视频。拍摄20秒钟即可,然后将视频导入Audacity分析波峰的时间差。如图所示的延迟是60ms。
方法3:
编写demo,设备A点击按钮时立刻将画面显示成全屏红,目的是用于标记,此时设备A不发声,让设备B发声。如果没有录音盒,手机拍摄视频,手机的拍摄帧率必须要求120fps或者240fps,太低的话误差太大。
为什么呢,假设手机为30fps,即每秒只能拍摄30张图片,每张图片的间隔就是1000ms/30 = 33.3 ms,在测试延迟的环境下,随便误差一下就是33ms,所以几乎测不准。
拍摄完成后,可以使用PotPlayer、剪映等软件找到画面改变的时间戳,以及之后的第一个波峰时间戳,将两个时间戳相减即可得到延迟
注意:此方案受视频本身的影响,测量结果精确度不佳
场景二:设备单独发声的Latency测试
该场景不需要传输数据包,编解码的工作都在本地,可以使用谷歌官方提供的OboeTester APP测试,如图是小米14的测试结果,latency均值在37.9ms。