ijkplayer播放主要流程
- 根据链接的schema找到对应的URLProtocol。
- 如Http的链接,对应libavformat/http.c
- 而http的请求后续会转换成Tcp的协议,对应libavformat/tcp.c
- 进行DNS解析ip地址,并且解析完后进行缓存,以便下次复用
- 从链路中读取数据到Buffer
- 有可能从tcp链路,也有可能从磁盘链路
- TCP链路则会需要等待三次握手的时间
- 读取Buffer进行文件类型的probe
- 探测文件格式,判断是mp4,flv等等
- 读取Buffer的头部信息进行解析
- 解析文件头部,判断是否为该格式文件,如果失败则返回错误
- 解析audio,video,subtitle流
- 根据文件信息找到多媒体流
- 优先使用H264的视频流
- 根据流信息找到解码器
- 开启各个线程开始对各个流进行解码成packet
- 同步到read_thread线程后,装入pakcetQueue中
- 在video_refresh_thread线程中,读取packetQueue中的包,进行时钟同步
- 开始绘制视频,播放音频内容
ijkplayer优化方向
- 网络链路优化
- IP直连:减少dns
- 减少随机值:提高CDN缓存资源命中率
- 文件探测&头部读取优化
- 控制文件探测大小:probesize参数
- 控制分析时长:analyzeduration参数
- 去掉循环滤波:skip_loop_filter参数
- buffer优化
- 直接刷新数据包:flush_packets
- 去掉packet-buffering:packet-buffering
- 解码优化
- 是否可以不解析subtitle、audio
当probesize和analyzeduration过小时,可能会造成预读数据不足,无法解析出码流信息,从而导致播放失败、无音频或无视频的情况。所以,在服务端对视频格式进行标准化转码,从而确定视频格式,进而再去推算 avformat_find_stream_info 分析码流信息所兼容的最小的 probesize 和 analyzeduration,就能在保证播放成功率的情况下最大限度地区优化首屏秒开
编译参数优化
// 跳过循环滤波
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);
// 设置最长分析时长
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzemaxduration", 100L);
// 通过立即清理数据包来减少等待时长
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "flush_packets", 1L);
// 暂停输出直到停止后读取足够的数据包
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0L);
// 网络不好的情况下进行丢包
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 1L);
// 去掉音频
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "an", 1);
// 不查询stream_info,直接使用
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER,"find_stream_info", 0);
// 等待开始之后才绘制
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "render-wait-start", 1);
测试数据
未加优化参数
描述 | 大小 | 时长(ms) |
---|---|---|
第一次安装 | 51.4M | 842 |
杀进程进入 | 238 | |
未杀进程重进 | 245 | |
第一次安装 | 39.2M | 294 |
杀进程进入 | 264 | |
未杀进程重进 | 256 | |
第一次安装 | 11.5M | 140 |
杀进程进入 | 146 | |
未杀进程重进 | 126 |
加入优化参数
描述 | 大小 | 时长(ms) |
---|---|---|
第一次安装 | 51.4M | 207 |
杀进程进入 | 194 | |
未杀进程重进 | 212 | |
第一次安装 | 39.2M | 176 |
杀进程进入 | 156 | |
未杀进程重进 | 133 | |
第一次安装 | 11.5M | 98 |
杀进程进入 | 106 | |
未杀进程重进 | 88 |
PS:数据为多组测试数据平均值