欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~
一、问题背景与分析
不久前,团队发现其Android平台App在播放MV视频《凤凰花开的路口》时,会带有如电流声一般的杂音,这影响了用户体验。 研发同学在初步定位时,发现有如下特征:
- Android平台杂音问题必现;
- iOS、PC平台能正常播放,没有噪音。
然而,各平台都是统一用HLS格式播放,即源头都是一样的。对于该问题,我们的定位思路如下:
- 梳理视频播放流程;
- 找到切入点排查。
二、播放流程概览

分析播放流程如上图(图中内容从左往右),概括其关键步骤如下:
- 播放器初始化:
- 创建读数据线程:
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以下配置参数:
- 采样率
- 位深
- 频道
以上参数设置的值与音频流的相符合,该环节正常。
3、音频解码逻辑是否有问题
验证解码逻辑是否有问题,可以通过对PCM数据进行分析来确认。 对aout_thread_n进行修改,将PCM数据
