1. 程式人生 > 程式設計 >如何在vue中使用video.js播放m3u8格式的視訊

如何在vue中使用video.js播放m3u8格式的視訊

@[toc] 注意:

 "vue": "^2.6.11","video.js": "^7.10.2","videojs-contrib-hls": "^5.15.0","mux.js": "^5.7.0"

一、安裝

yarn add video.js
yarn add videojs-contrib-hls // 這是播放hls流需要的外掛
yarn add mux.js // 在vue專案中,若不安裝它可能報錯

二、引入videojs

1.在src資料夾下新建 plugins資料夾,並新建video.js檔案;

video.js檔案的內容如下:

import "video.js/dist/video-js.css"; // 引入video.js的css
import hls from "videojs-contrib-hls"; // 播放hls流需要的外掛
import Vue from "vue";
Vue.use(hls);

2.在main.js中引入剛剛的video.js檔案

import "./plugins/video.js"; // 引入剛剛定義的video.js檔案

三、在元件中測試並使用

1. 實現基本的自動播放

Test.vue檔案

<template>
 <div class="test-videojs">
 <video id="videoPlayer" class="video-js" muted></video>
 </div>
</template>
<script>
import Videojs from "video.js"; // 引入Videojs 
export default {
 data() {
 return {
 // https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8 是一段視訊,可將cctv1 (是live現場直播,不能快退)的替換為它,看到快進快退的效果
  nowPlayVideoUrl: "http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8"
 };
 },mounted() {
 this.initVideo(this.nowPlayVideoUrl);
 },methods: {
 initVideo(nowPlayVideoUrl) {
  // 這些options屬性也可直接設定在video標籤上,見 muted
  let options = {
  autoplay: true,// 設定自動播放
  controls: true,// 顯示播放的控制元件
  sources: [
   // 注意,如果是以option方式設定的src,是不能實現 換臺的 (即使監聽了nowPlayVideoUrl也沒實現)
   {
   src: nowPlayVideoUrl,type: "application/x-mpegURL" // 告訴videojs,這是一個hls流
   }
  ]
  };
  // videojs的第一個引數表示的是,文件中video的id
  const myPlyer = Videojs("videoPlayer",options,function onPlayerReady() {
  console.log("onPlayerReady 中的this指的是:",this); // 這裡的this是指Player,是由Videojs創建出來的例項
  console.log(myPlyer === this); // 這裡返回的是true
  });
 }
 }
};
</script>
<style lang="scss">
#videoPlayer {
 width: 500px;
 height: 300px;
 margin: 50px auto;
}
</style>

視訊播放效果如圖:

如何在vue中使用video.js播放m3u8格式的視訊

列印結果如圖:

如何在vue中使用video.js播放m3u8格式的視訊

2. 實現換臺

Test.vue檔案

<template>
 <div class="test-videojs">
 <video id="videoPlayer" class="video-js"></video>
 <el-button type="danger" @click="changeSource">切換到CCTV3</el-button>
 </div>
</template>
<script>
import Videojs from "video.js"; // 引入Videojs
export default {
 data() {
 return {
  nowPlayVideoUrl: "http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8",options: {
  autoplay: true,// 設定自動播放
  muted: true,// 設定了它為true,才可實現自動播放,同時視訊也被靜音 (Chrome66及以上版本,禁止音視訊的自動播放)
  preload: "auto",// 預載入
  controls: true // 顯示播放的控制元件
  },player:null
 };
 },mounted() {
 this.getVideo(this.nowPlayVideoUrl);
 },methods: {
 getVideo(nowPlayVideoUrl) {
  this.player = Videojs("videoPlayer",this.options);
  //關鍵程式碼, 動態設定src,才可實現換臺操作
  this.player.src([
  {
   src: nowPlayVideoUrl,這是一個hls流
  }
  ]);
 },changeSource() {
  this.nowPlayVideoUrl = "http://ivi.bupt.edu.cn/hls/cctv3hd.m3u8";
  console.log(this.nowPlayVideoUrl,"改變了");
 }
 },watch: {
 nowPlayVideoUrl(newVal,old) {
  this.getVideo(newVal);
 }
 },beforeDestroy() {
 if (this.player) {
  this.player.dispose(); // Removing Players,該方法會重置videojs的內部狀態並移除dom
 }
 }
};
</script>
<style lang="scss">
#videoPlayer {
 width: 500px;
 height: 300px;
 margin: 50px auto;
}
</style>

視訊切換效果如圖:

如何在vue中使用video.js播放m3u8格式的視訊

如何在vue中使用video.js播放m3u8格式的視訊

四、踩坑小記

1. 視訊不能自動播放 或報錯 DOMException: play() failed

需用muted屬性解決

報錯資訊:DOMException: play() failedbecause the user didn't interact with the document first.(使用者還沒有互動,不能呼叫play)

解決辦法:設定muted屬性為true

 <video id="videoPlayer" class="video-js" muted></video>

關於muted屬性:

  • muted 屬性,設定或返回音訊是否應該被靜音(關閉聲音);屬性的值是true和false;
  • muted="false" 表示視訊不用靜音(視訊播放便有聲音),但設定 muted="fasle" 的情況下,視訊無法實現自動播放。
  • video 標籤中 muted 的作用: 允許視訊自動播放;(Chrome66版本開始,禁止視訊和音訊的自動播放)

2. 換臺的時候,url已經成功更改,但視訊還是之前的

需得動態設定src才能實現

// 動態設定src
this.player.src([
  {
   src: nowPlayVideoUrl,這是一個hls流
  }
 ]);

3. 找不到mux.js模組

報錯資訊:* mux.js/lib/tools/parse-sidx in ./node_modules/video.js/dist/video.es.js To install it,you can run: npm install --save mux.js/lib/tools/parse-sidx

解決辦法:安裝mux.js

yarn add mux.js

五、 播放rtmp流

播放rtmp流的操作與播放hls流的操作幾乎相同,不同在於:

import "videojs-flash"; // 播放rtmp流需要的外掛
type: 'rtmp/flv',// 這個type值必寫,告訴videojs這是一個rtmp流視訊

以上就是如何在vue中使用video.js 播放m3u8格式的視訊的詳細內容,更多關於vue 使用videojs 播放m3u8格式的視訊的資料請關注我們其它相關文章!