利用ffmpeg打造播放器直播观看公网rtmp1s延时极致优化

此文章主旨为了说明在无须修改ffmpeg任何源码,以及修改编码参数设置以及服务器、CDN配置,优化播放器即可达到1s延时效果。

关于rtmp直播流打开慢和延时大的问题,
很多人共识播放器在公网都在2-3s的延时是正常的,
前天一款播放器拉流rtmp,延时在1s,果断去分析这个软件
,发现他就是用了ffmpeg,然后和那款播放器提供者,聊
了下,想套点大概的思路,基本上没套出啥,没办法只能自己动手
然后根据以往的经验和群里几位大神的建议下,说干就干,
花了一天的时间,终于从延时3s优化到了1s的延时,
不敢独享,拿出来供大家参考。
以下的优化点以重到轻方式描述出来:

1、rtmp直播流打开慢
avformat_find_stream_info(),
这个函数会花去主要的时间,
因为要做流的分析拆分等,
所以优化可以重点从这个函数入手。
一种是设置probesize,这个设置为FLAG_NOBUFFER
数据包不入缓冲区,用于分析不显示,并且还可以设置max_anlyze_duration2默认值
这块可以参考ijkplayer这块的设置挺好;

另一种方法比较极端些
自己实现这个函数的功能,以替代avformat_find_stream_info接口,前提就是要知道你的
流的相关信息,经过测试这样设置之后,仅耗时9ms左右,效果很明显,具体做法就是
根据metadata信息,手动设置解码参数,
针对264+aac的rtmp可以考虑这种优化方案,这个效果比较明显
具体可以根据个人项目需求来取舍。

2、第二个关于播放延时的问题,比如ffplay默认的帧率控制没有追帧的策略,其实说白了
就是同步算法不够好,在播放网络流的时候,那么如果网络如果发生抖动,延时会累加。
这个就是群里一个哥们说这个1s延时效果能够出现多久的原因,经过半个小时测试依然坚挺着。
优化策略就是调整帧率控制部分。具体做法就是
解码线程运行的时候获取机器本地时间,第一帧计算机器时间
与流pts的时间差(本地时间和流时间同步),
流的时间落后本地时间多的情况下,快放或者考虑丢包
原则就是要在流畅度和实时性之间得到一个平衡。

3、第三个优化的地方,需要优化缓存区,说白了就是一般的播放器都有自己的一个缓冲区,
那么这个缓冲区存储数据到获取第一帧数据不能超过200ms,这个就是你要优化你的缓冲区,
每个播放器的缓冲区实现方式不一样,所以这个也不好具体表述,我这边就是用的deque做的缓存区,
做的也比较简单。

4、第四个优化的地方,就是视频渲染这块,渲染这块优化,每个人写的不一样,同样使用opengl显示,
每个人写的效率不一样,这个就看个人功力了,不熟悉可以看看qtav这块的代码,还是不错的;

5、第五个优化的地方,这个其实就是这个歌播放器的框架,以及数据直接的拷贝传递的效率等各种控制
都会影响最终的结果,这个也是说看个人的能力吧。

口说无凭,最后上图证明一切,跑了半个小时,还是很稳定(播放器观看手机推流):

转载于:https://my.oschina.net/klttl/blog/734873

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值