文章目录。
- 前言。
- 1. 无声。
- 2. 断音。
- 3. 杂音。
- 4. 延迟播放。
- 5. 焦点问题。
- 6. 连接蓝牙后的无声问题。
- 未完待续...
前言。
本文总结了 Android 在汽车开发中遇到的情况 Audio 相关问题,由于 Audio 有许多场景在模块中出现音频问题,每一个问题,主要做思路分析,细节上没有进一步的纠缠,#xff0c;后期慢慢完善首先做一个框架总结,供您参考。
1. 无声。
实例:现象:蓝牙通话时,汽车和手机都是无声的。
原因分析:
因为车端断开了 SCO(电话音频)xff0;连接,所以车端没有声音手机端的 SCO 也没有建立。
常见思路:
整机无声( BT 与手机一起播放声音时):通路策略错误;BT 状态错误data 往 BT 走,BT 断开不能播放;全局静音;音量为 0;往下写 data 时间中间出现了 mute ;
整机无声(只有手机):也许播放设备没有正确选择,输出设备策略的选择。
A2DP 无声:数据走正常情况 A2DP,实际上走了 SCO,但 SCO #xfff00不能接收c;所以没有声音。
SCO 无声:网络原因;没有打开 mic。
2. 断音。
例子车机连接蓝牙耳机断断续续地播放视频声音输出。
原因分析:
Framework端分析a;Android dump pcm 文件,播放声音正常。排除Framework 端的 问题,转耳机硬件分析。
耳机端分析:从 btsnoop 分析了车机发出的音频无卡顿,数据帧也饱和,如果耳机端断断续续地卡住了,耳机问题,试试另一个耳机。

常见思路:
在 其他平台如 MTK,audio dump 中 resample in 节点断音,可能是 underrun,原因是 APP 写数据太慢这种情况不能优化三方只能解决。
断音在其他节点向下移动c;通过调整 buffer 大小解决方案(buffer一般不动减少 buffer 会有断音增大 buffer 会有延迟)。
数据写得很快,慢写可能会导致断音。(实际开发目前还没有遇到后期遇到补充案例)。
3. 杂音。
实例现象:连接蓝牙耳机,刚打开视频 App 播放时会有噪音。
原因思路:爆破声,杂音, 需要提供 audio dump, tcpdump 结合以太网等日志的分析。
Framework 分析:
- 连接耳机和不连接耳机都会有噪音,只是喇叭不容易听到,底层日志信息观看视频 App 中 AudioTrack 都有 underrun 提示。
- HAL 底层试图增加视频播放器 AudioTrack buffer 大小后,这个问题仍然存在仍然存在c;已经说明是应用层写数据慢造成的。
- 从 audio dump 从数据来看,杂音处数据只有一两帧,但是连续出现多次导致“滋滋"”;的杂声。说明问题时在断流的临界点附件中写入数据。
分析结论:需视频 App端进一步分析部数据写入慢问题。
常见思路:
通过 audio dump定位在节点 af_track 有杂音属于是 APP 写下的数据有噪音。 资源文件有杂音,无法优化。没有杂音的资源文件#xff0c;也许上层太忙了,太小的bufferc;出现了 underrun,造成数据损坏,通过调整这种情况 解决rbufferc;调整 frameCount,扩大延迟变长,request 太多,但是写的少,write 可能会丢失数据。中间的噪音,如effect,resample 等情况。
分析 dump,确定出现问题的节点,杂音分析 buffer,断音一般为 underrun (上层app写数据太慢供不应求会造成断音或杂音,一般来说,解决方案是调整 buffer 大小,buffer 调大)3秒一般是 standby。
4. 延迟播放。
实例现象:CarPlay 中间音乐歌曲切换延迟较高,可能较高 3秒。
原因分析:在网络连接下延迟 1~3 秒属于正常现象,不同的手机和不同的播放器在不同的网络下表现不同。 延迟由手机控制,机器端无法优化。
常见思路:看最开始 write 数据时间,也许一开始写的数据是空的。或者延迟写数据的时间。
5. 焦点问题。
这是一个相对较大的模块,涉及焦点策略,如混音、中断、禁止等策略。各 App 端需要与系统端策略达成一致,另外,由于 车辆上有许多第三方应用,有些提供方不方便维护要么问题保持现状,要么系统端 Audio 这里适合进一步分析具体问题。稍后,我将分别总结一些常见的音频焦点问题。
常见思路:排查关键字: CarAudioFocus、MediaFocus 分析焦点栈,然后结合焦点策略,进一步分析焦点的申请和释放,以及消息的传递。 AudioManager #xfff0是否正确c;App 相关逻辑是否根据焦点变化处理。
6. 连接蓝牙后的无声问题。
实例现象:蓝牙电话无声。
思维分析:
Framework 确认通道是否打开,采样率是否正确设置,与底层传输的参数是否正确,需要与底层沟通具体参数。如关键字分析:
audio_hw_primary: adev_set_parameters: enter: open_source=0:2。
audio_hw_primary: adev_set_parameters: enter: hfp_set_sampling_rate=48000。
audio_hw_hfp: origin_audio_extn_hfp_set_parameters: hfp_enable=true。
蓝牙端分析:
结合 log 分析,蓝牙电话调用的原生 hfp 通道,启动初始化时 hfp 由于通路接口的初始化错误。
audio_hw_primary: adev_set_parameters: enter: hfp_enable=true。
audio_hw_hfp: origin_audio_extn_hfp_set_parameters: hfp_enable=true。
常见思路: 考虑是否写作 data,data有没有传下去?c;data 是否为mute,上层 app 传递命令是否错误,BT 协议不匹配track start 是不是马上就停了?BT控制是否有问题。
未完待续...