视频播放器(直播、录播一体化)解决方案(video.js + flv.js + videojs-flvjs)

背景描述:


实现一款视频播放器,同时支持直播和录播功能

功能清单:


支持解析m3u8或flv两种直播流,
支持录播且多段分段视频播放
支持直播流之间互相切换
支持直播与录播之间互相切换
支持播放器工具栏定制化开发

技术选型


video.js + flv.js + videojs-flvjs


videojs

Video.js是专为HTML5世界打造的网络视频播放器。它支持HTML5和Flash视频,以及YouTube和Vimeo(通过插件)。它支持在台式机和移动设备上播放视频。该项目始于2010年年中,现在已在播放器上使用50,000 100,000 200,000 40万个网站

定位: HTML5 & Flash video player

特点:
支持直播、录播、以及集成第三方插件播放技术,同事支持定制化控制栏开发;
并且在该社区已经建立了数百个您可以安装的皮肤和插件,例如Chromecast,IMA甚至VR

初始化方式:

1.引用库

 <link href="//vjs.zencdn.net/7.3.0/video-js.min.css" rel="stylesheet">
 <script src="//vjs.zencdn.net/7.3.0/video.min.js"></script>
  1. html部分

    <video  id="my-player" class="video-js">
       <p class="vjs-no-js">
         To view this video please enable JavaScript, and consider upgrading to a web browser that
         <a href="https://videojs.com/html5-video-support/" target="_blank">
           supports HTML5 video
         </a>
      </p>
    </video>
    
  2. js部分

    var player = videojs('my-player', {
        techOrder: ["html5"],
        autoplay: "muted",
        controls: true,
        controlBar: {
           volumePanel: false,
           remainingTimeDisplay: false,
           progressControl: false,
           fullscreenToggle: false,
           audioTrackButton: false,
           playToggle: false,
           liveDisplay: false,
           pictureInPictureToggle: false
        },
        sources: [
             {
               src: "http://localhost:8083/video/video/oceans.mp4",
               type: "video/mp4"  //录播
             },
            {
               src: "http://ivi.bupt.edu.cn/hls/hunanhd.m3u8",
               type: "application/x-mpegURL"  //直播
             }
         ]
       }, function onPlayerReady() {
          videojs.log('Your player is ready!');
          // In this context, `this` is the player that was created by Video.js.
          this.play();
          // How about an event listener?
          this.on('ended', function() {
          videojs.log('Awww...over so soon?!');
        });
    });
    

代码解释:当录播源oceans.mp4初始化不成功的情况下会采用湖南卫视直播流进行播放(不支持多段分段处理),且定制化了默认组件初始化方式


flvjs

用纯JavaScript编写的HTML5 Flash Video(FLV)播放器,不带Flash,
flv.js的工作原理是将FLV文件流转换为ISO BMFF(分段MP4)段,然后<video>通过Media Source Extensions API 将mp4段馈送到HTML5 元素中。

定位:HTML5 FLV Player

特点:
具有H.264 + AAC / MP3编解码器播放功能的FLV容器
多段分段视频播放
HTTP FLV低延迟实时流播放
通过WebSocket进行FLV实时流播放
与Chrome,FireFox,Safari 10,IE11和Edge兼容
极低的开销,浏览器可以加速硬件

初始化方式:

1.引用库

<script src="flv.min.js"></script>

2.html部分

<video id="videoElement"></video>

3.js部分

//场景1:直播
if (flvjs.isSupported()) {
    var videoElement = document.getElementById('videoElement');
    var flvPlayer = flvjs.createPlayer({
        type: 'flv',
        url: "https://dlhdl-cdn.zhanqi.tv/zqlive/197952_NHycj.flv",
        isLive: true
    });
    flvPlayer.attachMediaElement(videoElement);
    flvPlayer.load();
    flvPlayer.play();
}

 //场景2:录播(单段)
if (flvjs.isSupported()) {
    var videoElement = document.getElementById('videoElement');
    var flvPlayer = flvjs.createPlayer({
        type: 'flv',
        url: 'http://localhost:8083/video/video/bbb.flv'
    });
    flvPlayer.attachMediaElement(videoElement);
    flvPlayer.load();
    flvPlayer.play();
}
 //场景3:录播(多段分段)
if (flvjs.isSupported()) {
    var videoElement = document.getElementById('videoElement');
    var flvPlayer = flvjs.createPlayer({
        type: 'flv',
        duration: 73000,
        segments: [
          {
            duration: 33000,
            url: "http://localhost:8083/video/video/bbb.flv"
          },
          {
            duration: 40000,
            url: "http://localhost:8083/video/video/play.flv"
          }
        ]
    });
    flvPlayer.attachMediaElement(videoElement);
    flvPlayer.load();
    flvPlayer.play();
}

期中总结:
就目前前面所看到的,videojs满足了直播及录播部分的功能但对于多段处理没有解决办法,而flvjs满足了直播,录播,多段处理,但对于视频格式局限于flv,且不能定制化开发控制栏

videojs与flvjs本质上是两个不相关的库,无论是技术上还是初始化实现上,而我们的需求功能点恰巧分散在这两个库中,如何将其融合呢,接下来登场的是videojs-flv


videojs-flvjs

该库允许Video.js技术使用flv.js通过MSE(而非Flash)播放FLV

定位:让videojs可以使用flvjs的技术去播放FLV格式视频文件

初始化方式:

1.引用库

<!-- Video.js -->
<link href="//path/to/video-js.css" rel="stylesheet">
<script src="//path/to/video.min.js"></script>
<!-- flv.js -->
<script src="//path/to/flv.min.js"></script>
<!-- videojs-flvjs -->
<script src="//path/to/videojs-flvjs.min.js"></script>

2.html部分

<video id="videojs-flvjs-player"></video>

3.js部分

 //场景1 录播(单段)
videojs('videojs-flvjs-player', {
  techOrder: ['html5', 'flvjs'],
  flvjs: {
    mediaDataSource: {
      isLive: false,
      cors: true,
      withCredentials: false
    }
  },
  sources: [{ src: "http://localhost:8083/video/video/bbb.flv", type: "video/flv"}]
});

//场景2 录播(多段)
videojs('videojs-flvjs-player', {
  techOrder: ['html5', 'flvjs'],
  flvjs: {
    mediaDataSource: {
        isLive: false,
        cors: true,
        withCredentials: false,
        duration: 73000,
        segments: [
          {
            duration: 33000,
            url: "http://localhost:8083/video/video/bbb.flv"
          },
          {
            duration: 40000,
            url: "http://localhost:8083/video/video/play.flv"
          }
        ]
    },
    sources: [{ src: "-1", type: "video/flv"}]
  }
});

期末总结:
videojs是支持集成第三方插件播放技术,它默认是支持html5和flash两种技术方式,而videojs-flv其实是给videojs注册了一个针对flv格式的解析技术。

接下来我们看一下videojs-flv的源码


image.png

首先他从全局环境获取到了videojs的全局函数


image.png

image.png

所以官网才会说是通过flvjs技术去播放flv格式文件,不过官网只给出了通过videojs初始化单段的案例也就是场景一(单段)的案例,并没有给出结合之后如何初始化多段分段播放的例子,这里着实踩了不少坑。遇到这种情况,首先通过源码能够锁定大方向没错,只要flv能支持的功能,结合之后videojs肯定也是支持的,不需要犹豫,其次官方没有给出详细案例的情况,需要我们大胆的去尝试和验证。其实最后多段的实现案例中,source中对象的src为-1并没有任何意义,但是一定得有内容,不能为空字符串。关键一点,type必须指定video/flv格式,这是和用flvjs去初始化多段分段的案例中不同的地方。

至此,通过videojs-flvjs将videojs和flvjs两个库进行了一个融合,达到了功能清单中所有的功能在一个播放器实现的技术需求。
最终采用的直播方式为:HLS提供 的m3u8视频直播流,及flv格式多段录播文件流。期间定制化了播放器控制栏组件,下一章预备分享,定制化videojs控制栏组件开发。敬请期待。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343