亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解vue2.0+vue-video-player實現(xiàn)hls播放全過程

 更新時間:2018年03月02日 10:23:00   作者:Fei___  
這篇文章主要介紹了詳解vue2.0+vue-video-player實現(xiàn)hls播放全過程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

起因

最近公司想做一套視頻點播服務(wù),因為考慮到成本問題,領(lǐng)導(dǎo)希望一切都用開源系統(tǒng)來完成?;谶@個出發(fā)點,那就肯定排除了各大云視頻平臺(騰訊云 音視頻點播VOD、網(wǎng)易云視頻、七牛云、阿里云 視頻服務(wù)等)。其實這里我還是建議購買云視頻平臺,因為自己造輪子肯定沒有別人造的好(專門研發(fā)團隊除外、以此業(yè)務(wù)為生的公司除外),再說,云視頻平臺服務(wù)商提供的都是一整套解決方案:收集、存儲、轉(zhuǎn)碼、播放器等,并且在cdn和彈性擴容上都能得到最大保障。

準備

視頻點播最少需要兩樣?xùn)|西:流媒體服務(wù)、視頻播放器。 因為這是一篇講述前端播放器的帖子,關(guān)于流媒體服務(wù)的搭建我就pass了,以后有時間再補充新帖。

因為公司前端架構(gòu)用的是vue全家桶,所以還是希望能夠找一款基于vue封裝的視頻播放器。

首先到vue社區(qū)找到了vue-dplayer,于是就install到本地測試了一下,這時候出現(xiàn)個問題:此播放器在播放基于hls協(xié)議的m3u8文件時(視頻文件在流媒體服務(wù)已經(jīng)成功部署),在ios上能夠正常播放(自家協(xié)議支持良好),但是在pc的chrome上是不支持的。然后我去github上找了找資料,資料顯示Dplay(vue-dplayer就是依據(jù)Dplay封裝的)是支持hls的,只是需要引入hls.js,然后用hls對video對象進行處理。因為hls.js與Dplayer示例代碼是針對video對象處理的,引入到項目中還需要修改vue-dplayer的一個屬性,時間緊迫,先放棄之(之后我會有一篇專門介紹Dplayer播放hls的帖子,已補充),轉(zhuǎn)身投入vue-video-player的懷抱。

為什么會用vue-video-player?

1. 我搭建的流媒體服務(wù)的管理頁面內(nèi)的播放器就是用的videoJs(vue-video-player是依據(jù)videoJs封裝的),使用之后感覺良好。
2. 百度輸入“vue video”,vue-video-player就在頂部。(哈哈,就是這么隨意)
3. 當(dāng)然還是看了demo頁,支持的協(xié)議齊全。
4. 雖然vue-video-player的github上還有些issues沒有關(guān)閉,但是自己覺得守著videoJs強大的庫與萬千使用者,總能解決問題。(迷之自信?。?/p>

開整

安裝依賴

npm install vue-video-player --save

引入樣式

// 第一個是videoJs的樣式,后一個是vue-video-player的樣式,因為考慮到我其他業(yè)務(wù)組件可能也會用到視頻播放,所以就放在了main.js內(nèi)
require('video.js/dist/video-js.css')
require('vue-video-player/src/custom-theme.css')

把VueVideoPlayer導(dǎo)入并掛在到vue上

//在main.js內(nèi)
import VideoPlayer from 'vue-video-player'
Vue.use(VideoPlayer);

編寫業(yè)務(wù)組件 myPlayer.vue

<template>
 <div class="container">
 <div class="player">
  <video-player class="video-player vjs-custom-skin"
      ref="videoPlayer"
      :playsinline="true"
      :options="playerOptions"
      @play="onPlayerPlay($event)"
      @pause="onPlayerPause($event)"
  >
  </video-player>
 </div>
 </div>
</template>

<script>
import { videoPlayer } from 'vue-video-player';
export default {
 data () {
 return {
  playerOptions: {
//  playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度
  autoplay: false, //如果true,瀏覽器準備好時開始回放。
  muted: false, // 默認情況下將會消除任何音頻。
  loop: false, // 導(dǎo)致視頻一結(jié)束就重新開始。
  preload: 'auto', // 建議瀏覽器在<video>加載元素后是否應(yīng)該開始下載視頻數(shù)據(jù)。auto瀏覽器選擇最佳行為,立即開始加載視頻(如果瀏覽器支持)
  language: 'zh-CN',
  aspectRatio: '16:9', // 將播放器置于流暢模式,并在計算播放器的動態(tài)大小時使用該值。值應(yīng)該代表一個比例 - 用冒號分隔的兩個數(shù)字(例如"16:9"或"4:3")
  fluid: true, // 當(dāng)true時,Video.js player將擁有流體大小。換句話說,它將按比例縮放以適應(yīng)其容器。
  sources: [{
   type: "application/x-mpegURL",
   src: "video.m3u8" //你的m3u8地址(必填)
  }],
  poster: "poster.jpg", //你的封面地址
  width: document.documentElement.clientWidth,
  notSupportedMessage: '此視頻暫無法播放,請稍后再試', //允許覆蓋Video.js無法播放媒體源時顯示的默認信息。
//  controlBar: {
//   timeDivider: true,
//   durationDisplay: true,
//   remainingTimeDisplay: false,
//   fullscreenToggle: true //全屏按鈕
//  }
  }
 }
 },
 components: {
 videoPlayer
 },
 methods: {
 onPlayerPlay(player) {
  alert("play");
 },
 onPlayerPause(player){
  alert("pause");
 },
 },
 computed: {
 player() {
  return this.$refs.videoPlayer.player
 }
 }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style type="text/css" scoped>
 .container {
 background-color: #efefef;
 min-height: 100%;
 }
</style>

注意:

1. video-player標簽的class必須設(shè)置成“video-player vjs-custom-skin”,你引入的樣式才能起作用。我剛開始做時,直接拷貝的github頁的代碼,那個代碼的class是video-player-box。
2. 根據(jù)videoJS Api修改屬性。我這里加了一些注釋,可以參考。
3. 修改src、poster屬性為你的服務(wù)器資源地址。

增加hls支持

//安裝依賴
npm install --save videojs-contrib-hls

//在main.js內(nèi)引入
require('videojs-contrib-hls/dist/videojs-contrib-hls');

啟動服務(wù),查看效果

npm run dev

chrome手機尺寸效果

videoJs的播放按鈕默認為橢圓形,我個人有點不習(xí)慣,所以修改成了圓形。

增加css樣式

.video-js .vjs-big-play-button{
  /*
  播放按鈕換成圓形
  */
 height: 2em;
 width: 2em;
 line-height: 2em;
 border-radius: 1em;
 }

注意:

直接在 myPlayer.vue組件內(nèi)增加樣式會被覆蓋,不論你有沒有增加scoped屬性,這取決于vue加載樣式的順序,之前查資料看了一個帖子,講的很好,可惜找不著了。

我最終的解決方案是:自定義了一個css文件,使用require引入到了main.js內(nèi),放在上述樣式引入之后。

require('video.js/dist/video-js.css');
require('vue-video-player/src/custom-theme.css');
require('@/../static/css/myVideoCss.css');

大bug: 播放按鈕與fastclick沖突

沖突是這樣的:播放器在手機瀏覽器或者chrome開發(fā)者工具(手機尺寸)內(nèi),點擊播放按鈕,播放與暫停事件會被觸發(fā)多次。

剛開始不知道什么原因,在github上提了個issure,剛提完就發(fā)現(xiàn)上一個關(guān)閉的issure解決的就是這個問題,這里得向作者道個歉,給您添堵了。哈哈。于是我看了另外一個人給的答案:與fastclick插件沖突……,但是….. 沒有解決方案。然后我嘗試注釋掉了fastclick,果然是它影響的。

然后我去fastclick github 地址看了看 ,頁面說的很清楚,只要在觸發(fā)的元素上增加一個needsclick的class就可以了。

但是我試了好久都沒有成功。這時候看到了神貼,大體瀏覽了一下fastclick的源碼過程,并且作者提到“Fastclick 把 this.needsClick 放到了 ontouchEnd 末尾去執(zhí)行,才導(dǎo)致前面說的加上了“needsclick”類名也無效的問題?!彼晕蚁雵L試修改fastclick的源碼,并且驗證一下。

我把整個faseclick.js拷貝了出來,并采用require的方式引用。

const FastClick = require('@/../static/js/fastclick.js');
FastClick.attach(document.body);

打開代碼,猜想為什么needsclick沒有起到作用,所以就直接檢索了一下這個單詞,在 FastClick.prototype.needsClick方法的最后,有一個驗證:

return (/\bneedsclick\b/).test(target.className);

首先FastClick.prototype.needsClick方法是判斷元素是否要保留穿透功能,而最后一行肯定是驗證觸發(fā)的元素的class是不是含有needsclick。所以我先猜測是不是我觸發(fā)的元素沒有加上class,所以console了target.className:

這里寫圖片描述

果然沒有,并且發(fā)現(xiàn)一個規(guī)律,我需要控制的按鈕都是以vjs開頭的,所以,在驗證上再增加一個驗證。

復(fù)制代碼 代碼如下:

return ((/\bneedsclick\b/).test(target.className) || (/\bvjs/).test(target.className));

問題解決,當(dāng)然解決問題的方式暴力了一些,所以這里我希望看到并覺得此帖有幫助的同學(xué)能夠在此基礎(chǔ)上繼續(xù)補充完善。我就先趟到這。最后貼個版本

 "fastclick": "^1.0.6",
 "videojs-contrib-hls": "^5.12.2",
 "vue": "^2.2.2",
 "vue-router": "^2.2.0",
 "vue-video-player": "^4.0.6",

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue+Element-UI中el-table動態(tài)合并單元格:span-method方法代碼詳解

    Vue+Element-UI中el-table動態(tài)合并單元格:span-method方法代碼詳解

    el-table是element-ui提供的表格組件,可以用于展示和操作數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于Vue+Element-UI中el-table動態(tài)合并單元格:span-method方法的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • vue項目中公用footer組件底部位置的適配問題

    vue項目中公用footer組件底部位置的適配問題

    footer為公用組件,其他頁面都需要引入。接下來通過本文給大家分享vue項目中公用footer組件底部位置的適配問題,需要的朋友可以參考下
    2018-05-05
  • Vue必學(xué)知識點之forEach()的使用

    Vue必學(xué)知識點之forEach()的使用

    在前端開發(fā)中,經(jīng)常會遇到一些通過遍歷循環(huán)來獲取想要的內(nèi)容的情形,這時候就需要用到forEach()了,下面這篇文章主要給大家介紹了關(guān)于Vue必學(xué)知識點之forEach()使用的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • vue+render+jsx實現(xiàn)可編輯動態(tài)多級表頭table的實例代碼

    vue+render+jsx實現(xiàn)可編輯動態(tài)多級表頭table的實例代碼

    這篇文章主要介紹了vue+render+jsx實現(xiàn)可編輯動態(tài)多級表頭table的實例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的工作或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • vue 表單驗證按鈕事件交由父組件觸發(fā)的方法

    vue 表單驗證按鈕事件交由父組件觸發(fā)的方法

    這篇文章主要介紹了vue 表單驗證按鈕事件交由父組件觸發(fā)的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • vue 過濾器filter實例詳解

    vue 過濾器filter實例詳解

    VueJs 提供了強大的過濾器API,能夠?qū)?shù)據(jù)進行各種過濾處理,返回需要的結(jié)果。這篇文章主要給大家介紹vue 過濾器filter實例,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-03-03
  • vue中導(dǎo)出Excel表格的實現(xiàn)代碼

    vue中導(dǎo)出Excel表格的實現(xiàn)代碼

    項目中我們可能會碰到導(dǎo)出Excel文件的需求,這篇文章主要介紹了vue中導(dǎo)出Excel表格的實現(xiàn)代碼,非常具有實用價值,需要的朋友可以參考下
    2018-10-10
  • Vue3 elementUI 中 date-picker 使用過程遇到坑

    Vue3 elementUI 中 date-picker 使用過程遇到坑

    這篇文章主要介紹了Vue3 elementUI 中 date-picker 使用過程遇到坑,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-10-10
  • vue使用keep-alive保持滾動條位置的實現(xiàn)方法

    vue使用keep-alive保持滾動條位置的實現(xiàn)方法

    這篇文章主要介紹了vue使用keep-alive保持滾動條位置的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • vue2項目中封裝echarts地圖的優(yōu)雅方法

    vue2項目中封裝echarts地圖的優(yōu)雅方法

    這篇文章主要給大家介紹了關(guān)于vue2項目中封裝echarts地圖的優(yōu)雅方法,需要的朋友可以參考下
    2022-03-03

最新評論