实际的缓存时间会根据网络情况动态变化 , 值的范围在上述两个配置项之间 。
处理卡顿关键 —— 断流检测直播是实时流播放,任何一个环节出现异常 , 都会导致直播卡顿、出现黑屏等现象 。这是因为实时拉取的流数据断开了,我们称之为“断流” 。
多数情况下的断流都是网络原因导致 , 此时可能需要提醒用户“当前网络拥堵”、或者显示“直播加载中”的字样,告诉用户发生了什么 。
而实现这些功能的前提,必须要知道流什么时候断开 , 我们就需要做“断流检测” 。
mpegts.js 提供了几个内置事件来监听直播的状态,常用如下:
- mpegts.Events.ERROR:出现异常事件 。
- mpegts.Events.LOADING_COMPLETE:流结束事件 。
- mpegts.Events.STATISTICS_INFO:流状态变化事件 。
let player = mpegts.createPlayer({...})player.on(mpegts.Events.ERROR, e=> {console.log('发生异常')});player.on(mpegts.Events.LOADING_COMPLETE, (e) => {console.log("直播已结束");});
当未发生异常、且直播未结束的情况下,我们就需要监听直播卡顿 。通过监听 STATISTICS_INFO 事件来实现 。首先科普一下:播放器在播放直播时需要实时解码,每一帧画面过来,就需要解码一次 。当直播卡顿时,没有画面过来,解码也会暂停,因此可以通过已解码的帧数来判断是否卡顿 。
STATISTICS_INFO 事件的回调函数参数中 , 有一个 decodedFrames 属性 , 正是表示当前已解码的帧数,我们来看一下:
player.on(mpegts.Events.STATISTICS_INFO, (e) => {console.log("解码?。?quot;e.decodedFrames); // 已经解码的帧数});
在直播过程中,上述回调函数会一直执行,打印结果如下:文章插图
可以看到,解码帧一直在递增,表示直播正常 。
当直播卡顿时,打印结果是这样的:
文章插图
【Flv.js 直播简单?延迟和卡顿你怎么处理】解码帧连续 9 次卡在了 904 一个数值不变 , 这是因为直播卡顿了 , 没有画面需要解码 。
所以,判断卡顿的方法是将上一次的解码帧与当前解码帧做对比 , 如果值一致则出现了卡顿 。
当然轻微的卡顿不需要处理 。我们可以将连续 N 次出现相同的解码帧视为一次卡顿,然后执行自己的业务逻辑 。
当解码帧的值长时间没有变化时 , 我们可以视为推流已结束,此时可以主动结束直播 。
推荐阅读
- 跳绳对身体的益处
- 朱同学不装了!疑似建立直播团队,直播间控评,赚7万音浪
- 元宝怎么叠最简单图解 元宝怎么叠
- 衣服上的锈迹怎么洗掉 衣服除铁锈最简单的方法
- 张兰泪洒直播间,保姆的离职是导火索,还有两个担心才是主要原因
- 卫生间地面存水补救 卫生间地面存水补救简单方法条形地漏
- 快手直播通知怎么关闭,快手直播通知在哪怎么设置关闭
- 满屏爱心怎么弄微信,直播间爱心特效怎么弄的
- 李国庆在直播时碰到了叶璇的胸部,叶璇大叫: 你刚打到我的胸部了
- 直播分成比例惹争议,主持人周倩选择离职,网红小杨哥再遭质疑!