npm install video.js --save  
npm install videojs-flash --save //rtmp格式
//flv格式
npm install flv.js --save
npm install videojs-flvjs-es6 --save
//hls格式  video.js7.0以后版本默认支持hls(m3u8)格式  可以不安装,装了也可以使用
npm install videojs-contrib-hls --save



页面引入
	import Videojs from 'video.js'
   import 'video.js/dist/video-js.css'
   import "videojs-flvjs-es6";
   import "videojs-flash";



// 标签容器
<video
   id="mmiid"
    class="video-js vjs-big-play-centered vjs-fluid"
    controls
    preload="auto"
    width="100%"
    height="100%"
    >
</video>





// hls
this.videoPlayer = Videojs(document.querySelector('#mmiid'),{
          autoplay: 'muted',//自动播放
          controls: true,//用户可以与之交互的控件
          loop:true,//视频一结束就重新开始
          muted:false,//默认情况下将使所有音频静音
          aspectRatio:"16:9",//显示比率
          fullscreen:{
              options: {navigationUI: 'hide'}
          },
          techOrder: ["html5", "flvjs"],// 兼容顺序
          html5:{hls: {
              withCredentials: true
          }},
          sources: [{ src: 'http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8', type: "application/x-mpegURL" }]
      })

//flv
this.videoPlayer = Videojs(document.querySelector('#mmiid'),{
       autoplay: 'muted',//自动播放
        controls: true,//用户可以与之交互的控件
        loop:true,//视频一结束就重新开始
        muted:false,//默认情况下将使所有音频静音
        aspectRatio:"16:9",//显示比率
        fullscreen:{
            options: {navigationUI: 'hide'}
        },
        techOrder: ["html5", "flvjs"],// 兼容顺序
        flvjs: {
            mediaDataSource: {
                isLive: false,
                cors: true,
                withCredentials: false
            }
        },
        sources: [{ src: urlList[0].url, type: "video/x-flv" }]
    })


// 其他
//rtmp
techOrder: ["html5",  "flash"],// 兼容顺序
sources: [{ src: this.videoUrl, type: "rtmp/flv" }]
// mp4
sources: [{ src: this.videoUrl, type: "video/mp4" }]





一些补充说明

1.对于Video.js 5.x及更低版本,Flash技术是Video.js核心存储库的一部分。对于Video.js 6.x及更高版本,Flash技术位于单独的存储库中。videojs-flash.js插件只与Video.js> = 6.0.0一起使用,因为之前的flash技术已构建到版本中! video.js不能直接播放rtmp流,需要videojs-flash.js 这个插件。

2.对于播放HLS视频,在videojs7版本之前要引用videojs-contrib-hls.js插件才能播放。videojs7版本之后的,Video.js默认捆绑VHS(VHS是videojs-contrib-hls的继承者。它是一个源自videojs-contrib-hls存储库的源处理程序。虽然videojs-contrib-hls最初设计用于在所有浏览器上添加HLS播放,但我们意识到引擎也可以播放其他格式,所以videojs-contrib-hls这个项目已经被弃用,被videojs-http-streaming继承)。默认情况下,在Video.js 7及以上版本中已经集成Videojs HTTP Streaming(昵称为VHS),不必使用videojs-http-streaming插件就可以播放HLS,DASH和未来的HTTP流媒体协议视频。

注意:

1.对于Video.js 7之前的版本(明确说是6版本的),必须使用videojs-http-streaming.js插件才可以播放HLS,DASH和未来的HTTP流媒体协议视频,即使它们不是本机支持的。

2.VHS支持HLS和DASH和未来的HTTP流媒体协议。

  • 介绍 https://www.cnblogs.com/stoneniqiu/p/5807568.html

插件内部可以直接调用播放器的api。 有一款playlist的插件可以研究下,如过你需要播放列表。https://github.com/brightcove/videojs-playlist 以及 http://videojs.com/advanced/ 有这样的效果:

rtmp

html5环境不支持rtmp; rtmp需要flash环境;

首先,rtsp不能使用于网页环境(包含PC端和移动端)。 那么直播只能选择rtmp或http

rtmp协议只支持flashplayer,也就是只能在PC端(或安卓环境中安装了flashplayer组件,这种环境比较少)安装了flashplayer的情况下使用。按现在的趋势,flashplayer是要逐渐被淘汰掉的。当然,在中国还会存在相对长时间。

http协议的直播分两种格式,m3u8和flv。flv是一种即将被淘汰的直播格式。用来做直播已显的力不从心了。所以综合考虑,m3u8相对的比较好点,优点是支持移动端, 并且支持PC端上安装了flashplayer的环境。缺点就如同rtmp一样。flashplayer并不是未来的发展趋势。

另外一个缺点就是m3u8是有延迟的。并不能实时,实时传输方面不如rtmp协议。因为m3u8的直播原理是将直播源不停的压缩成指定时长的ts文件(比如9秒,10秒一个ts文件) 并同时实时更新m3u8文件里的列表以达到直播的效果。这样就会有一个至少9,10秒的时间延迟。如果压缩的过小,可能导致客户端网络原因致视频变卡。

最近要做摄像头视频的展示,不想使用硬件方的专用插件,所以计划视频推送到SRS服务器,浏览器再通过rtmp协议显示,类似于直播。

经查询,了解到可以用ckplayer(有许可条款)和video.js在html页面中。尝试了video.js_5.x可以正常播放,而6.x版本不能播放,可目前video.js已经更新到了7.x!

几经折腾,发现6.x版本后需要单独的flash插件,早期版本包含了flash,官方说明如下:

websocket

<template>
  <div class="test">
 
  </div>
</template>
 
<script>
  export default {
    name : 'test',
    data() {
      return {
        websock: null,
      }
    },
    created() {
      this.initWebSocket();
    },
    destroyed() {
      this.websock.close() //离开路由之后断开websocket连接
    },
    methods: {
      initWebSocket(){ //初始化weosocket
        const wsuri = "ws://127.0.0.1:8080";
        this.websock = new WebSocket(wsuri);
        this.websock.onmessage = this.websocketonmessage;
        this.websock.onopen = this.websocketonopen;
        this.websock.onerror = this.websocketonerror;
        this.websock.onclose = this.websocketclose;
      },
      websocketonopen(){ //连接建立之后执行send方法发送数据
        let actions = {"test":"12345"};
        this.websocketsend(JSON.stringify(actions));
      },
      websocketonerror(){//连接建立失败重连
        this.initWebSocket();
      },
      websocketonmessage(e){ //数据接收
        const redata = JSON.parse(e.data);
      },
      websocketsend(Data){//数据发送
        this.websock.send(Data);
      },
      websocketclose(e){  //关闭
        console.log('断开连接',e);
      },
    },
  }
</script>
<style lang='less'>
 
</style>

videojs的一些监听事件汇总

options

常见options成员(写在option这个对象中) autoplay : true/false 播放器准备好之后,是否自动播放,默认false

controls : true/false 是否拥有控制条 ,默认true 如果设为false ,界面上不会出现任何控制按钮,那么只能通过api进行控制了

height: 字符串或数字(字符串带单位) 视频容器的高度,比如: height:300 or height:‘300px’

width: 字符串或数字 视频容器的宽度, 单位像素

loop : true/false 视频播放结束后,是否循环播放

muted : true/false 是否静音

poster: 通常传入一个URL 播放前显示的视频画面,播放开始之后自动移除。

preload: ‘auto’/ ‘metadata’ / ‘none’ 预加载

auto-自动 metadata-元数据信息 ,比如视频长度,尺寸等 none-不预加载任何数据,直到用户开始播放才开始下载

children: Array | Object 可选子组件 从基础的Component组件继承而来的子组件 数组中的顺序将影响组件的创建顺序 整后会生成的dom少一些,加载也快一些 播放器在html中的常见的组件元素 children: Array | Object 可选子组件 从基础的Component组件继承而来的子组件 数组中的顺序将影响组件的创建顺序 整后会生成的dom少一些,加载也快一些 播放器在html中的常见的组件元素

sources:Array
sources: [{ src: ‘…mp4’, type: ‘video/mp4’}, { src: ‘…webm’, type: ‘video/webm’}]

资源文件 等价于html中的

techOrder: [‘html5’] 默认为[‘html5’],'flash’可以有,比如 [‘html5’, ‘flash’] 在v6.0.0 及以上的版本中,默认不包含flash的使用代码。如果要使用flash播放的,需要手动引入flash相关逻辑的代码。且需要指定swf文件的路径。 plugins:自动初始化要加载的插件


var options = {};
 
var player = videojs(‘example_video_1‘, options, function onPlayerReady() {
  videojs.log(‘播放器已经准备好了!);
 
  // In this context, `this` is the player that was created by Video.js.<br>  // 注意,这个地方的上下文, `this` 指向的是Video.js的实例对像player
  this.play();
 
  // How about an event listener?<br>  // 如何使用事件监听?
  this.on(‘ended‘, function() {
    videojs.log(‘播放结束了!);
  });
});



var playerVideo = videojs("my-player", options, function onPlayerReady() {
    videojs.log('Your player is ready!');
    
    this.on("loadstart",function(){
        console.log("开始请求数据 ");
    })
    this.on("progress",function(){
        console.log("正在请求数据 ");
    })
    this.on("loadedmetadata",function(){
        console.log("获取资源长度完成 ")
    })
    this.on("canplaythrough",function(){
		console.log("视频源数据加载完成")
    })
    this.on("waiting", function(){
        console.log("等待数据")
    });
    this.on("play", function(){
		console.log("视频开始播放")
    });
    this.on("playing", function(){
        console.log("视频播放中")
    });
    this.on("pause", function(){
        console.log("视频暂停播放")
    });
    this.on("ended", function(){
        console.log("视频播放结束");
    });
    this.on("error", function(){
        console.log("加载错误")
    });
    this.on("seeking",function(){
        console.log("视频跳转中");
    })
    this.on("seeked",function(){
        console.log("视频跳转结束");
    })
	this.on("ratechange", function(){
        console.log("播放速率改变")
    });
    this.on("timeupdate",function(){
        console.log("播放时长改变");
    })
    this.on("volumechange",function(){
        console.log("音量改变");
    })
    this.on("stalled",function(){
        console.log("网速异常");
    })
   
    
});

// 1.6 手动控制播放条的显示和隐藏
video.on(‘tap’, function(){
if (player.userActive() === true) {
player.userActive(false);
} else {
player.userActive(true);
}
}); 

video 属性与方法


//错误状态  
   Media.error; //null:正常  
   Media.error.code; //1.用户终止 2.网络错误 3.解码错误 4.URL无效  
  
//网络状态  
   Media.currentSrc; //返回当前资源的URL  
   Media.src = value; //返回或设置当前资源的URL  
   Media.canPlayType(type); //是否能播放某种格式的资源  
   Media.networkState; //0.此元素未初始化  1.正常但没有使用网络  2.正在下载数据  3.没有找到资源  
   Media.load(); //重新加载src指定的资源  
   Media.buffered; //返回已缓冲区域,TimeRanges  
   Media.preload; //none:不预载 metadata:预载资源信息 auto:  
  
//准备状态  
   Media.readyState;    //1:HAVE_NOTHING 2:HAVE_METADATA 3.HAVE_CURRENT_DATA 4.HAVE_FUTURE_DATA 5.HAVE_ENOUGH_DATA  
   Media.seeking; //是否正在seeking  
  
//回放状态  
   Media.currentTime = value; //当前播放的位置,赋值可改变位置  
   Media.startTime; //一般为0,如果为流媒体或者不从0开始的资源,则不为0  
   Media.duration; //当前资源长度 流返回无限  
   Media.paused; //是否暂停  
   Media.defaultPlaybackRate = value;//默认的回放速度,可以设置  
   Media.playbackRate = value;//当前播放速度,设置后马上改变  
   Media.played; //返回已经播放的区域,TimeRanges,关于此对象见下文  
   Media.seekable; //返回可以seek的区域 TimeRanges  
   Media.ended; //是否结束  
Media.autoPlay; //是否自动播放  
Media.loop; //是否循环播放  
   Media.play();    //播放  
   Media.pause();   //暂停  
  
//控制  
Media.controls;//是否有默认控制条  
   Media.volume = value; //音量  
   Media.muted = value; //静音  
  
   //TimeRanges(区域)对象  
TimeRanges.length; //区域段数  
TimeRanges.start(index) //第index段区域的开始位置  
TimeRanges.end(index) //第index段区域的结束位置

修改H5 中video默认 的样式

//全屏按钮
video::-webkit-media-controls-fullscreen-button {
   display: none;
}
//播放按钮
video::-webkit-media-controls-play-button {
  //display: none;
}
//进度条
video::-webkit-media-controls-timeline {
   //display: none;
}
//观看的当前时间
video::-webkit-media-controls-current-time-display{
   display: none;
}
//剩余时间
video::-webkit-media-controls-time-remaining-display {
   display: none;
}
//音量按钮
video::-webkit-media-controls-mute-button {
   //display: none;
}
video::-webkit-media-controls-toggle-closed-captions-button {
  // display: none;
}
//音量的控制条
video::-webkit-media-controls-volume-slider {
  // display: none;
}
//所有控件
video::-webkit-media-controls-enclosure{
  // display: none;
}
video::-webkit-media-controls-overlay-enclosure{
  display: none;
}
video::-internal-media-controls-loading-panel{
  display: none;opacity: 0;visibility: hidden;width: 0px;height: 0px;
  border: 2px crimson solid;
}

video js

npm install --save video.js
npm install --save videojs-contrib-hls

引入videojs的css文件,例如在main.js中引入

import 'video.js/dist/video-js.css'

需要播放视频的页面引入js对象

import videojs from "video.js"; import "videojs-contrib-hls";

import videojs from 'video.js';
import 'videojs-contrib-hls';
import 'video.js/dist/video-js.css';
import VideojsZhcnLanguage from 'video.js/dist/lang/zh-CN.json';

videojs.addLanguage('zh-CN',VideojsZhcnLanguage);

const myPlayer = ref<any>(null);
const mountedFlag = ref<boolean>(false);
// 初始化视频组件
const initVideo = (url:string) => {
  if (myPlayer.value) {
    myPlayer.value.pause();
    myPlayer.value.dispose();
  }
  // 向Dom中写入视频组件
  document.getElementById('video-box').innerHTML = '';
  const html = `<video id="fire-video" class="video-js vjs-default-skin vjs-big-play-centered" controls preload="auto" style="width: 100%;height:100%">
        <source id="source" src="${url}" type="application/x-mpegURL">
    </video>`;

  document.getElementById('video-box').innerHTML = html;
  // 初始化声明
  myPlayer.value = videojs('fire-video',{
    language: 'zh-CN',
    autoplay: 'muted',
    bigPlayButton: false,
    textTrackDisplay: false,
    posterImage: true,
    errorDisplay: false,
    controlBar: true,
  });
  videojs.hook('beforeerror', (player, err) => {
    // Video.js 在切换/指定 source 后立即会触发一个 err=null 的错误,这里过滤一下
    if (err !== null) {
      myPlayer.value.src(url);
    }

    // 清除错误,避免 error 事件在控制台抛出错误
    return null;
  });

  myPlayer.value.play();
};

// 监听,需要视频url由其他方法赋值且组件挂载完成后,才能进行初始化
watch([cameraURL,mountedFlag,], ([url,flag,]): void => {
  if (url && flag) {
    initVideo(url);
  }
});

onMounted(() => {
  setTimeout(() => {
    mountedFlag.value = true;
  }, 500);
});
// 组件销毁
onUnmounted(() => {
  if (myPlayer.value) {
    mountedFlag.value = false;
  }
}); 

操作 上面通过videojs创建了一个Player对像,我们就可以通过这个对象的各种函数来操作播放器。 同样这里只说说常用的函数,其他的大家参考官网docs.videojs.com/player

src(string | SourceObject | SourceObject[]):设置视频源 src():string:获取当前视频源 play():播放 pause():暂停 paused():boolean:是否暂停 currentTime(number):设置播放位置,就是seek currentTime():number:获取当前播放位置 muted():boolean:是否静音 muted(boolean):设置静音 duration():number:获取时长 controls(boolean):设置控制栏显示隐藏 controls():boolean:控制栏是否显示 requestFullscreen():全屏播放 exitFullscreen():退出全屏播放 isFullscreen():boolean:是否全屏播放 dispose():销毁播放器 error(MediaError):设置一个错误 error():MediaError:获取当前错误。配合error事件

事件 通过Player.on(string, EventListener)函数可以设置播放器的监听事件,第一个参数是事件名称,第二个参数是回调。 同样这里说说常用的事件,所有事件大家可以查阅官网docs.videojs.com/player

canplay:视频可以播放 playing:播放 pause:暂停 timeupdate:播放进度更新 ended:播放完成 fullscreenchange:全屏状态改变 error:视频播放错误。可以配合player的error函数来获取处理错误。代码如下:

   player.on("error", () => {
      const error = player.error();
      console.log("video error:" + error.code + "-" + error.message);
    });






    checkVideo() {
    var myPlayer = videojs("my-video");
    myPlayer.src([
        {
            type: "application/x-mpegURL",
            src: "http://ivi.bupt.edu.cn/hls/cctv3hd.m3u8" //CCTV3频道
        }
    ]);
    myPlayer.play();
}