一、问题背景与分析
不久前,团队发现其Android平台App在播放MV视频《凤凰花开的路口》时,会带有如电流声一般的杂音,这影响了用户体验。 研发同学在初步定位时,发现有如下特征:
- Android平台杂音问题必现;
- iOS、PC平台能正常播放,没有噪音。
然而,各平台都是统一用HLS格式播放,即源头都是一样的。对于该问题,我们的定位思路如下:
- 梳理视频播放流程;
- 找到切入点排查。
二、播放流程概览
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YsNtgApK-1629987344477)(https://user-gold-cdn.xitu.io/2018/10/10/1665d7bc380cffae?imageView2/0/w/1280/h/960/ignore-error/1)]
分析播放流程如上图(图中内容从左往右),概括其关键步骤如下:
- 播放器初始化:
- 创建读数据线程:
read_thread
; - 创建存放audio解码前数据的队列:
audioq
; - 创建存放audio解码后数据的队列:
sampq
。
- 创建读数据线程:
- 数据读取:
- ①创建context;
- ②探测协议类型:
avformat_open_input
; - ③探测媒体类型:
avformat_find_stream_info
; - ④获取音视频流:
av_find_best_stream
; - ⑤打开媒体解码器:
stream_component_open
; - ⑥读取媒体数据,获得AVPacket:
av_read_frame(ic, pkt)
; - ⑦音视频数据分别送入
audioq
中; - 重复⑥、⑦步骤到数据完毕。
- 音频解码:
- 在
audio_thread
中对audioq
中的数据进行decoder_decode_frame
解码; - 解码后的帧
AVFrame
存放到sampq
中;
- 在
- 音频播放:
aout_thread_n
中,通过调用回调接口sdl_audio_callback
,对sampq
中的音频帧数据进行解码成PCM数据;- 写入PCM数据到buffer数组,并由
AudioTrack
播放。
三、问题分解与切入
在梳理出播放流程后,标记出找到有可能出错的环节,方便进行“分层定位”(图中黄色标记)
- 播放下载文件是否有问题;
- 数据读取是否有问题;
- 音频解码逻辑是否有问题;
AudioTrack
的设置是否有问题;
接下来,根据难易程度,对上述环节逐个验证。
1、播放下载文件是否正常
把Android平台播放的ts文件与各平台的进行比对,发现两者一样,该环节正常。
2、AudioTrack设置是否正常
通过日志检查AudioTrack
以下配置参数:
- 采样率
- 位深
- 频道
以上参数设置的值与音频流的相符合,该环节正常。