IjkPlayer起播速度优化

ijkplayer播放主要流程

  1. 根据链接的schema找到对应的URLProtocol。
    • 如Http的链接,对应libavformat/http.c
    • 而http的请求后续会转换成Tcp的协议,对应libavformat/tcp.c
  2. 进行DNS解析ip地址,并且解析完后进行缓存,以便下次复用
  3. 从链路中读取数据到Buffer
    • 有可能从tcp链路,也有可能从磁盘链路
    • TCP链路则会需要等待三次握手的时间
  4. 读取Buffer进行文件类型的probe
    • 探测文件格式,判断是mp4,flv等等
  5. 读取Buffer的头部信息进行解析
    • 解析文件头部,判断是否为该格式文件,如果失败则返回错误
  6. 解析audio,video,subtitle流
    • 根据文件信息找到多媒体流
    • 优先使用H264的视频流
  7. 根据流信息找到解码器
  8. 开启各个线程开始对各个流进行解码成packet
  9. 同步到read_thread线程后,装入pakcetQueue中
  10. 在video_refresh_thread线程中,读取packetQueue中的包,进行时钟同步
  11. 开始绘制视频,播放音频内容

ijkplayer优化方向

  1. 网络链路优化
    • IP直连:减少dns
    • 减少随机值:提高CDN缓存资源命中率
  2. 文件探测&头部读取优化
    • 控制文件探测大小:probesize参数
    • 控制分析时长:analyzeduration参数
    • 去掉循环滤波:skip_loop_filter参数
  3. buffer优化
    • 直接刷新数据包:flush_packets
    • 去掉packet-buffering:packet-buffering
  4. 解码优化
    • 是否可以不解析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:数据为多组测试数据平均值

推荐阅读更多精彩内容

  • pdf下载地址:Java面试宝典 第一章内容介绍 20 第二章JavaSE基础 21 一、Java面向对象 21 ...
    王震阳阅读 89,459评论 26 538
  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    保川阅读 2,910评论 1 13
  • 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者...
    JasonShi6306421阅读 618评论 0 1
  • Java IO 的底层原理 缓冲处理、内核空间与用户空间 缓冲与缓冲的处理方式,是所有I/O操作的基础。术语“输入...
    懒癌正患者阅读 1,283评论 1 10
  • 本文主要通过整理网络上的资料,整理出的关于TCP方面的简单理论知识。作为Java程序员虽然更多的时候我们都是直接调...
    tomas家的小拨浪鼓阅读 3,761评论 1 97