视频播放器(直播、录播一体化)解决方案(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.引用库

 
 
  1. html部分

    
    
  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)段,然后通过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.引用库


2.html部分


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.引用库








2.html部分


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的全局函数


视频播放器(直播、录播一体化)解决方案(video.js + flv.js + videojs-flvjs)_第1张图片
image.png

image.png

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

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

你可能感兴趣的:(视频播放器(直播、录播一体化)解决方案(video.js + flv.js + videojs-flvjs))