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:数据为多组测试数据平均值

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

dataguard归档路径的问题(r7笔记第99天)

最近处理了一起看似比较奇怪的dataguard归档路径问题。 问题的背景是这样的。 有一套一主两备的环境,备库1和主库在同一个机房,可以尝试在failover的...

331110
来自专栏晨星先生的自留地

实战系列之你真的会mysql注入么?

22950
来自专栏WeTest质量开放平台团队的专栏

可靠UDP,KCP协议快在哪?

原文链接:http://wetest.qq.com/lab/view/391.html

1.2K90
来自专栏FreeBuf

无文件Powershell恶意程序使用DNS作为隐蔽信道

思科Talos安全团队最近发现一款Powershell恶意程序,用DNS进行双向通信。 前言 DNS是企业网络中最常用的Internet应用层协议。DNS提供域...

31690
来自专栏程序员与猫

JSON Patch

34410
来自专栏黑泽君的专栏

网络通信的三要素

75950
来自专栏北京马哥教育

超详细!使用 LVS 实现负载均衡原理及安装配置详解

负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、lvs、haproxy,商业的硬件负载均衡...

507100
来自专栏蓝天

C/C++编程可用的Linux自带工具

GNU Binary Utilities或binutils是一整套的编程语言工具程序,用来处理许多格式的目标文件。当前的版本原本由在Cygnus Soluti...

15020
来自专栏Seebug漏洞平台

披着狼皮的羊——寻找惠普多款打印机中的RCE漏洞

原文:《A Sheep in Wolf’s Clothing – Finding RCE in HP’s Printer Fleet》

41080
来自专栏DeveWork

让WordPress 在RSS 中Feed 输出支持“More”标签

如果你的主题支持“more”标签,在写文章的时候加上“more”标签,首页就可以截断显示。“more”标签截断文章的意义在于能够随心所欲,想断就断(汗,越写越废...

21850

扫码关注云+社区

领取腾讯云代金券