Android网络广播和本地播放输出不一致的问题
背景
- Platform: RK3399
- OS: Android7.1.2
- Kernel: v4.4.103
问题
现象:相同的音频文件,最大的音量等级,网络广播音频codec输出的幅度始终比本地播放的小,达不到音频codec理论上的满幅输出(RMS:500mV)。
大致数据结果:android音量等级调到最大,网络广播(RMS:250mV), 本地播放(RMS:500mV)。
分析
我们APK通过网络接收广播数据,然后用AudioTrack
播放,本地播放也是使用相同的接口。x
根据Android的音量控制x框架(具体可参考我以前的文章),
总输出音量 = Android系统软件音量 * 音频Codec硬件音量**
**音频Codec硬件音量 = 音频Codec-DAC音量(数字音量) * 音频Codec-通道音量(AP模拟音量)
Android系统音量(数字音量) = stream Volume * master Volume * track Volume
音频codec的硬件音量都是一样的,所以调整track Volume
和master Volume
音效。
- 使用
audioTrack.setStereoVolume(1.0f, 1.0f)
,audioTrack.setVolume(1.0f)
设置track的音量为最大, - 关闭混响等音效
结果还是一样。
后来发现本地播放AudioTrack使用的是AudioManager.STREAM_MUSIC
流类型,而网络广播因为其他需求,使用的是AudioManager.STREAM_SYSTEM
。
然后反查音量调节曲线,发现音量最高的时候,刚好STREAM_MUSIC
为0dB,刚好STREAM_SYSTEM
为-6dB。
解决
修改音量调节曲线,具体在frameworks/av/services/audiopolicy/common/managerdefinitions/src/Gains.cpp
文件
评论