当前位置:首页 > 科技  > 软件

Flv.js 直播简单?延迟和卡顿你怎么处理

来源: 责编: 时间:2023-11-10 17:07:47 201观看
导读之前写过一篇浏览器直播的文章,叫《用一个 flv.js 播放监控的例子,带你深撅直播流技术》。主要内容就是科普直播是什么,以及如何在浏览器中播放直播。实现方法很简单,使用一个流行的第三方包 flv.js,即可快速播放直播。在

0Mo28资讯网——每日最新资讯28at.com

之前写过一篇浏览器直播的文章,叫《用一个 flv.js 播放监控的例子,带你深撅直播流技术》。主要内容就是科普直播是什么,以及如何在浏览器中播放直播。0Mo28资讯网——每日最新资讯28at.com

实现方法很简单,使用一个流行的第三方包 flv.js,即可快速播放直播。0Mo28资讯网——每日最新资讯28at.com

在我们的项目中也使用这种方式,比如播放海康监控器的直播、教学直播等,都可以正常播放。0Mo28资讯网——每日最新资讯28at.com

然而在产品成熟后,我们发现直播中有两个致命问题:0Mo28资讯网——每日最新资讯28at.com

  • 直播延迟,播越久延迟越高。
  • 直播卡顿,无法判断什么时候卡顿。

解决上述两个问题是直播稳定性和可用性的关键,下面就来详解一下。0Mo28资讯网——每日最新资讯28at.com

抗延迟关键 —— 追帧

使用 flv.js 直播,需要一个 <video> 标签承载直播画面。默认情况下 video 标签用于播放点播(录制好的)视频,因此它会一边播放一边下载。0Mo28资讯网——每日最新资讯28at.com

点播不要求实时性,暂停之后再继续播放,视频会接着暂停的画面继续播放;而如果是直播,暂停后继续播放时必须切换到最新的画面帧,这就是 “追帧” 的概念。0Mo28资讯网——每日最新资讯28at.com

一图胜千言,不追帧的效果是这样的:0Mo28资讯网——每日最新资讯28at.com

图片0Mo28资讯网——每日最新资讯28at.com

追帧的效果是这样的:0Mo28资讯网——每日最新资讯28at.com

图片0Mo28资讯网——每日最新资讯28at.com

可以看到,设置追帧后的暂停重播,会立即切换到最新的画面。0Mo28资讯网——每日最新资讯28at.com

在实际场景中,直播没有暂停按钮,但是常常会因为网络问题卡顿。如果卡顿恢复后视频没有追帧,就会导致直播延迟越来越高。0Mo28资讯网——每日最新资讯28at.com

使用 mpegts.js 替代 flv.js

据传说,flv.js 的作者是一个高中毕业在 B 站上班的小伙子,月薪仅仅不到 5k。后来小伙离职去了日本,无法更新 flv.js,于是有了 mpegts.js。0Mo28资讯网——每日最新资讯28at.com

目前 flv.js 已停止维护,mpegts.js 是其升级版,开发者是同一个人。涉及到追帧的高级功能,mpegts.js 支持地更好。0Mo28资讯网——每日最新资讯28at.com

在 flv.js 主页也可以看到推荐:0Mo28资讯网——每日最新资讯28at.com

图片0Mo28资讯网——每日最新资讯28at.com

mpegts.js 的用法与 flv.js 基本一致,如下:0Mo28资讯网——每日最新资讯28at.com

import mpegts from 'mpegts.js';let config = {};let player = mpegts.createPlayer(  {    type: 'flv',    isLive: true,    url: 'http://xxxx.flv',  },  config,);

mpegts.js 提供了自动追帧的配置项 liveBufferLatencyChasing,开启自动追帧方法如下:0Mo28资讯网——每日最新资讯28at.com

let config = {  liveBufferLatencyChasing: true,};

设置自动追帧后,虽然延迟问题解决了,但画面可能会更加卡顿。这里涉及到 IO 缓存的问题。0Mo28资讯网——每日最新资讯28at.com

配置 IO 缓存,优化追帧卡顿

首先思考一个问题:直播的延迟越低越好吗?0Mo28资讯网——每日最新资讯28at.com

从需求上讲,当然是越低越好;可从技术上讲,并不是越低越好。0Mo28资讯网——每日最新资讯28at.com

直播是实时流,从远端拉流并实时解码播放,但这个过程极容易受到网络影响。不管是推流端或拉流端遇到了网路抖动,数据传输受阻,直播必然会卡顿,这个是正常现象。0Mo28资讯网——每日最新资讯28at.com

怎么办呢?这个时候就要用到 IO 缓存,牺牲一点实时性,用延迟换取流畅。0Mo28资讯网——每日最新资讯28at.com

假设播放器缓存了 1 秒的数据流,并将直播延迟 1 秒播放。当遇到网络抖动时,播放器会读取缓存数据继续播放,网络恢复后再向缓冲区追加数据,这样用户在看直播时,完全感受不到卡顿。0Mo28资讯网——每日最新资讯28at.com

但如果网络异常时间超过 1 秒,缓冲区中的数据读取完毕,直播还是会卡住;如果加大缓存量,缓存了 3 秒的数据,这又会导致直播延迟过高。0Mo28资讯网——每日最新资讯28at.com

所以,设置缓存可以有效解决追帧卡顿问题;若要在保证流畅的前提下,尽可能地降低延迟,则需要一个合理的缓存值。0Mo28资讯网——每日最新资讯28at.com

mpegts.js 提供了 liveBufferLatencyMaxLatency 和 liveBufferLatencyMinRemain 两个配置项来控制缓存时间,分别表示最大缓存时间和最小缓存时间,单位为秒。0Mo28资讯网——每日最新资讯28at.com

以下方配置为例,缓存时间设置越长、流畅性越好、延迟越高:0Mo28资讯网——每日最新资讯28at.com

let config = {  liveBufferLatencyChasing: true, // 开启追帧  liveBufferLatencyMaxLatency: 0.9, // 最大缓存时间  liveBufferLatencyMinRemain: 0.2, // 最小缓存时间};

实际的缓存时间会根据网络情况动态变化,值的范围在上述两个配置项之间。0Mo28资讯网——每日最新资讯28at.com

处理卡顿关键 —— 断流检测

直播是实时流播放,任何一个环节出现异常,都会导致直播卡顿、出现黑屏等现象。这是因为实时拉取的流数据断开了,我们称之为“断流”。0Mo28资讯网——每日最新资讯28at.com

多数情况下的断流都是网络原因导致,此时可能需要提醒用户“当前网络拥堵”、或者显示“直播加载中”的字样,告诉用户发生了什么。0Mo28资讯网——每日最新资讯28at.com

而实现这些功能的前提,必须要知道流什么时候断开,我们就需要做“断流检测”。0Mo28资讯网——每日最新资讯28at.com

mpegts.js 提供了几个内置事件来监听直播的状态,常用如下:0Mo28资讯网——每日最新资讯28at.com

  • mpegts.Events.ERROR:出现异常事件。
  • mpegts.Events.LOADING_COMPLETE:流结束事件。
  • mpegts.Events.STATISTICS_INFO:流状态变化事件。

前两个事件分别会在出现异常和直播结束的时候触发,监听方法如下:0Mo28资讯网——每日最新资讯28at.com

let player = mpegts.createPlayer({...})player.on(mpegts.Events.ERROR, e=> {  console.log('发生异常')});player.on(mpegts.Events.LOADING_COMPLETE, (e) => {  console.log("直播已结束");});

当未发生异常、且直播未结束的情况下,我们就需要监听直播卡顿。通过监听 STATISTICS_INFO 事件来实现。0Mo28资讯网——每日最新资讯28at.com

首先科普一下:播放器在播放直播时需要实时解码,每一帧画面过来,就需要解码一次。当直播卡顿时,没有画面过来,解码也会暂停,因此可以通过已解码的帧数来判断是否卡顿。0Mo28资讯网——每日最新资讯28at.com

STATISTICS_INFO 事件的回调函数参数中,有一个 decodedFrames 属性,正是表示当前已解码的帧数,我们来看一下:0Mo28资讯网——每日最新资讯28at.com

player.on(mpegts.Events.STATISTICS_INFO, (e) => {  console.log("解码帧:"e.decodedFrames); // 已经解码的帧数});

在直播过程中,上述回调函数会一直执行,打印结果如下:0Mo28资讯网——每日最新资讯28at.com

图片0Mo28资讯网——每日最新资讯28at.com

可以看到,解码帧一直在递增,表示直播正常。0Mo28资讯网——每日最新资讯28at.com

当直播卡顿时,打印结果是这样的:0Mo28资讯网——每日最新资讯28at.com

图片0Mo28资讯网——每日最新资讯28at.com


0Mo28资讯网——每日最新资讯28at.com

解码帧连续 9 次卡在了 904 一个数值不变,这是因为直播卡顿了,没有画面需要解码。0Mo28资讯网——每日最新资讯28at.com

所以,判断卡顿的方法是将上一次的解码帧与当前解码帧做对比,如果值一致则出现了卡顿。0Mo28资讯网——每日最新资讯28at.com

当然轻微的卡顿不需要处理。我们可以将连续 N 次出现相同的解码帧视为一次卡顿,然后执行自己的业务逻辑。0Mo28资讯网——每日最新资讯28at.com

当解码帧的值长时间没有变化时,我们可以视为推流已结束,此时可以主动结束直播。0Mo28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-20050-0.htmlFlv.js 直播简单?延迟和卡顿你怎么处理

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: JVM的调优常用参数

下一篇: Requirements.txt你真的清楚吗

标签:
  • 热门焦点
  • SpringBoot中使用Cache提升接口性能详解

    SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • 为什么你不应该使用Div作为可点击元素

    为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 东方甄选单飞:有些鸟注定是关不住的

    东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,&ldquo;7
  • 年轻人的“职场羞耻感”,无处不在

    年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元&ldquo;人在职场,应该选择什么样的着装?&rdquo;近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 认真聊聊东方甄选:如何告别低垂的果实

    认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 华为Mate60标准版细节曝光:经典星环相机模组回归

    华为Mate60标准版细节曝光:经典星环相机模组回归

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
Top