ijkplayer直播播放器使用经验之谈——卡顿优化和秒开实现

    在我的博客移动平台播放器ijkplayer开源框架分析(以IOS源码为例),大致介绍了一下ijkplayer的基本函数调用顺序和主要线程作用,本博客想介绍一下在直播应用中,针对卡顿和秒开做的一些优化,本优化经验主要是用在Android系统上,ios上也可以借鉴,按本博客修改代码,网络带宽足够的情况下,音视频播放基本流畅不卡顿,首屏时间在500ms以内。

     首先来看直播应用中的卡顿。直播中会引起卡顿,主要是网络有抖动的时候,没有足够的数据来播放,ijkplayer会激发其缓冲机制,主要是有几个宏控制,主要需要做的修改是DEFAULT_LAST_HIGH_WATER_MARK_IN_MS这个宏的意思缓冲多少数据后开始通知缓冲完成,我们直播中设置为1 * 1000,也即缓冲1秒后开始通知缓冲完成,默认是5秒,如果过大,会让用户等太久,那么宏也可以设置DEFAULT_HIGH_WATER_MARK_IN_BYTES小一些,设置为30 * 1024。

    我们在来看看秒开,首先,我们知道在ijkplayer默认视频同步到音频,在video_refresh_thread对视频做了同步,我们把视频前两帧数据不做同步,即时刷新,这样能大大加快首屏时间,其次我们设置probesize大小,如果probesize不设置的话,avformat_find_stream_info会消耗很长时间,这里建议如果只是音频,设置1k,如果是音视频,设置为64k,更进一步的修改是自己设置相关解码属性,不用avformat_find_stream_info获取,最后我们还可以对前两帧的刷新时机进行进一步优化,现在通过sleep来控制,可以换成信号量,解码之后,立即通知开始执行渲染,改完这些之后基本上首屏能在500ms内。

    在这也说说关于直播的延迟,如果延迟过大,可以采取两种策略,一种是丢帧,一种是追帧。我们可以考虑丢音频包来实现,音频包不不在关键帧的问题,丢起来比较好操作,然后因为视频同步到音频,所以视频会追帧,也会跟上来。

    部分经验来自同事分享,在此表示感谢。

参考链接:

    https://www.jianshu.com/p/ecf51ee32589

    

你可能感兴趣的:(ijkplayer直播播放器使用经验之谈——卡顿优化和秒开实现)