此文章主旨为了说明在无须修改ffmpeg任何源码,以及修改编码参数设置以及服务器、CDN配置,优化播放器便可达到1s延时效果。算法
关于rtmp直播流打开慢和延时大的问题,
不少人共识播放器在公网都在2-3s的延时是正常的,
前天一款播放器拉流rtmp,延时在1s,果断去分析这个软件
,发现他就是用了ffmpeg,而后和那款播放器提供者,聊
了下,想套点大概的思路,基本上没套出啥,没办法只能本身动手
而后根据以往的经验和群里几位大神的建议下,说干就干,
花了一天的时间,终于从延时3s优化到了1s的延时,
不敢独享,拿出来供你们参考。
如下的优化点以重到轻方式描述出来:缓存
一、rtmp直播流打开慢
avformat_find_stream_info(),
这个函数会花去主要的时间,
由于要作流的分析拆分等,
因此优化能够重点从这个函数入手。
一种是设置probesize,这个设置为FLAG_NOBUFFER
数据包不入缓冲区,用于分析不显示,而且还能够设置max_anlyze_duration2默认值
这块能够参考ijkplayer这块的设置挺好;服务器
另外一种方法比较极端些
本身实现这个函数的功能,以替代avformat_find_stream_info接口,前提就是要知道你的
流的相关信息,通过测试这样设置以后,仅耗时9ms左右,效果很明显,具体作法就是
根据metadata信息,手动设置解码参数,
针对264+aac的rtmp能够考虑这种优化方案,这个效果比较明显
具体能够根据我的项目需求来取舍。网络
二、第二个关于播放延时的问题,好比ffplay默认的帧率控制没有追帧的策略,其实说白了
就是同步算法不够好,在播放网络流的时候,那么若是网络若是发生抖动,延时会累加。
这个就是群里一个哥们说这个1s延时效果可以出现多久的缘由,通过半个小时测试依然坚挺着。
优化策略就是调整帧率控制部分。具体作法就是
解码线程运行的时候获取机器本地时间,第一帧计算机器时间
与流pts的时间差(本地时间和流时间同步),
流的时间落后本地时间多的状况下,快放或者考虑丢包
原则就是要在流畅度和实时性之间获得一个平衡。框架
三、第三个优化的地方,须要优化缓存区,说白了就是通常的播放器都有本身的一个缓冲区,
那么这个缓冲区存储数据到获取第一帧数据不能超过200ms,这个就是你要优化你的缓冲区,
每一个播放器的缓冲区实现方式不同,因此这个也很差具体表述,我这边就是用的deque作的缓存区,
作的也比较简单。函数
四、第四个优化的地方,就是视频渲染这块,渲染这块优化,每一个人写的不同,一样使用opengl显示,
每一个人写的效率不同,这个就看我的功力了,不熟悉能够看看qtav这块的代码,仍是不错的;测试
五、第五个优化的地方,这个其实就是这个歌播放器的框架,以及数据直接的拷贝传递的效率等各类控制
都会影响最终的结果,这个也是说看我的的能力吧。优化
口说无凭,最后上图证实一切,跑了半个小时,仍是很稳定(播放器观看手机推流):编码