h5 video方法,事件,屬性詳解


1.video屬性

<!-- video 不支持 IE8及以下版本瀏覽器,支持三種視頻格式:MP4,WebM 和 Ogg -->
  <video src="test.mp4" controls width="400" height="300"></video>

  <!-- 禁止下載 -->
  <video src="test.mp4" controls controlslist="nodownload" width="400" height="300"></video>

  <!-- 禁止下載,禁止全屏 -->
  <video src="test.mp4" controls controlslist="nodownload nofullscreen" width="400" height="300"></video>

  <!-- 自動播放 (不同瀏覽器的表現不一樣) -->
  <video src="test.mp4" controls autoplay width="400" height="300"></video>

  <!-- 默認靜音播放(可手動點開繼續播放) -->
  <video src="test.mp4" controls muted width="400" height="300"></video>

  <!-- 循環播放 -->
  <video src="test.mp4" controls loop width="400" height="300"></video>

  <!-- 預加載 -->
  <video src="test.mp4" controls preload width="400" height="300"></video>

  <!-- 貼圖 -->
  <video src="test.mp4" poster="poster.jpg" controls width="400" height="300"></video>

  <!-- 音量控制 -->
  <video src="test.mp4" poster="poster.jpg" controls width="400" height="300" id="_volume"></video>
  <script>
    var video = document.getElementById('_volume')
    video.volume = 2 // 取值范圍:0 到 1,0 是靜音,0.5 是一半的音量,1 是最大音量(默認值)
  </script>

  <!-- 播放時間控制 -->
  <video src="test.mp4" poster="poster.jpg" controls width="400" height="300" id="_time"></video>
  <script>
    var video = document.getElementById('_time')
    console.log(video.currentTime)  // 視頻當前正在播放的時間(單位:s),進度條拖到哪就顯示當前的時間
    video.currentTime = 60  // 默認從60秒處開始播放
  </script>

  <!-- 播放地址切換 (常見於切換超清  高清 流暢,不同畫質的視頻地址不同) -->
  <video src="test.mp4" controls autoplay width="400" height="300" id="_src"></video>
  <script>
    var video = document.getElementById('_src')
    console.log(video.src)     // http://127.0.0.1:8001/test.mp4   絕對地址,DOM 中是相對地址
    // video.src = 'test-2.mp4'   // 直接替換掉了原來的視頻src
    setTimeout(() => {
      video.src = 'test-2.mp4'  // 播放到第 30s 的時候,自動切換視頻
    }, 30000)
  </script>

  <!-- 備用地址切換 -->
  <video controls autoplay width="400" height="300" id="_source">
    <source src="test3.mp4" type="video/mp4" />
    <source src="test9.mp4" type="video/mp4" />
    <source src="test-2.mp4" type="video/mp4" />
  </video>
  <script>
    var video = document.getElementById('_source')
    setTimeout(() => {
      console.log(video.currentSrc)     // http://127.0.0.1:8001/test.mp4
    }, 1000)

    // HTTP 載入失敗,狀態碼 404。媒體資源 http://127.0.0.1:8001/test3.mp4 載入失敗。
    // HTTP 載入失敗,狀態碼 404。媒體資源 http://127.0.0.1:8001/test9.mp4 載入失敗。
    // http://127.0.0.1:8001/test-2.mp4
    // 當第一段視頻加載失敗時,自動加載下一段視頻

2.video 事件

<script>
    var video = document.getElementById('video')

    // 1、loadstart:視頻查找。當瀏覽器開始尋找指定的音頻/視頻時觸發,也就是當加載過程開始時
    video.addEventListener('loadstart', function(e) {
      console.log('提示視頻的元數據已加載')
      console.log(e)
      console.log(video.duration)            // NaN
    })

    // 2、durationchange:時長變化。當指定的音頻/視頻的時長數據發生變化時觸發,加載后,時長由 NaN 變為音頻/視頻的實際時長
    video.addEventListener('durationchange', function(e) {
      console.log('提示視頻的時長已改變')
      console.log(e)
      console.log(video.duration)           // 528.981333   視頻的實際時長(單位:秒)
    })

    // 3、loadedmetadata :元數據加載。當指定的音頻/視頻的元數據已加載時觸發,元數據包括:時長、尺寸(僅視頻)以及文本軌道
    video.addEventListener('loadedmetadata', function(e) {
      console.log('提示視頻的元數據已加載')
      console.log(e)
    })

    // 4、loadeddata:視頻下載監聽。當當前幀的數據已加載,但沒有足夠的數據來播放指定音頻/視頻的下一幀時觸發
    video.addEventListener('loadeddata', function(e) {
      console.log('提示當前幀的數據是可用的')
      console.log(e)
    })

    // 5、progress:瀏覽器下載監聽。當瀏覽器正在下載指定的音頻/視頻時觸發
    video.addEventListener('progress', function(e) {
      console.log('提示視頻正在下載中')
      console.log(e)
    })

    // 6、canplay:可播放監聽。當瀏覽器能夠開始播放指定的音頻/視頻時觸發
    video.addEventListener('canplay', function(e) {
      console.log('提示該視頻已准備好開始播放')
      console.log(e)
    })

    // 7、canplaythrough:可流暢播放。當瀏覽器預計能夠在不停下來進行緩沖的情況下持續播放指定的音頻/視頻時觸發
    video.addEventListener('canplaythrough', function(e) {
      console.log('提示視頻能夠不停頓地一直播放')
      console.log(e)
    })

    // 8、play:播放監聽
    video.addEventListener('play', function(e) {
      console.log('提示該視頻正在播放中')
      console.log(e)
    })

    // 9、pause:暫停監聽
    video.addEventListener('pause', function(e) {
      console.log('暫停播放')
      console.log(e)
    })

    // 10、seeking:查找開始。當用戶開始移動/跳躍到音頻/視頻中新的位置時觸發
    video.addEventListener('seeking', function(e) {
      console.log('開始移動進度條')
      console.log(e)
    })

    // 11、seeked:查找結束。當用戶已經移動/跳躍到視頻中新的位置時觸發
    video.addEventListener('seeked', function(e) {
      console.log('進度條已經移動到了新的位置')
      console.log(e)
    })

    // 12、waiting:視頻加載等待。當視頻由於需要緩沖下一幀而停止,等待時觸發
    video.addEventListener('waiting', function(e) {
      console.log('視頻加載等待')
      console.log(e)
    })

    // 13、playing:當視頻在已因緩沖而暫停或停止后已就緒時觸發
    video.addEventListener('playing', function(e) {
      console.log('playing')
      console.log(e)
    })

    // 14、timeupdate:目前的播放位置已更改時,播放時間更新
    video.addEventListener('timeupdate', function(e) {
      console.log('timeupdate')
      console.log(e)
    })

    // 15、ended:播放結束
    video.addEventListener('ended', function(e) {
      console.log('視頻播放完了')
      console.log(e)
    })

    // 16、error:播放錯誤
    video.addEventListener('error', function(e) {
      console.log('視頻出錯了')
      console.log(e)
    })

    // 17、volumechange:當音量更改時
    video.addEventListener('volumechange', function(e) {
      console.log('volumechange')
      console.log(e)
    })

    // 18、stalled:當瀏覽器嘗試獲取媒體數據,但數據不可用時
    video.addEventListener('stalled', function(e) {
      console.log('stalled')
      console.log(e)
    })

    // 19、ratechange:當視頻的播放速度已更改時
    video.addEventListener('ratechange', function(e) {
      console.log('ratechange')
      console.log(e)
    })
</script>

3.基本示例

<video id="video" 
  style="object-fit:fill" 
  autoplay
  webkit-playsinline 
  playsinline 
  x5-video-player-type="h5"
  x5-video-player-fullscreen="true"
  x5-video-orientation="portraint" 
  src="video.mp4" />
</video>
<!--
  object-fit: fill   視頻內容充滿整個video容器
  poster:"img.jpg" 視頻封面
  autoplay: 自動播放
     auto - 當頁面加載后載入整個視頻
     meta - 當頁面加載后只載入元數據
     none - 當頁面加載后不載入視頻

  muted:當設置該屬性后,它規定視頻的音頻輸出應該被靜音

  webkit-playsinline playsinline:   內聯播放

  x5-video-player-type="h5" :  啟用x5內核H5播放器(移動端隱藏播放控件)
  x5-video-player-fullscreen="true"  全屏設置。ture和false的設置會導致布局上的不一樣
  x5-video-orientation="portraint" :聲明播放器支持的方向,可選值landscape 橫屏,portraint豎屏。
                                     默認值portraint。無論是直播還是全屏H5一般都是豎屏播放,
                                     但是這個屬性需要x5-video-player-type開啟H5模式
-->

.監控下載進度

 

// 視頻時長
var duration = video.duration

// 獲取視頻已經下載的時長
function getEnd(video) {
  var end = 0
  try {
    end = video.buffered.end(0) || 0
    end = parseInt(end * 1000 + 1) / 1000
  } catch(e) {
  }
  return end
}

  移動端填坑

<video id="video" 
  style="object-fit:fill" 
  autoplay
  webkit-playsinline 
  playsinline 
  x5-video-player-type="h5"
  x5-video-player-fullscreen="true"
  x5-video-orientation="portraint" 
  src="video.mp4" />
</video>
<!--
  object-fit: fill   視頻內容充滿整個video容器
  poster:"img.jpg" 視頻封面
  autoplay: 自動播放
     auto - 當頁面加載后載入整個視頻
     meta - 當頁面加載后只載入元數據
     none - 當頁面加載后不載入視頻

  muted:當設置該屬性后,它規定視頻的音頻輸出應該被靜音

  webkit-playsinline playsinline:   內聯播放

  x5-video-player-type="h5" :  啟用x5內核H5播放器
  x5-video-player-fullscreen="true"  全屏設置。ture和false的設置會導致布局上的不一樣
  x5-video-orientation="portraint" :聲明播放器支持的方向,可選值landscape 橫屏,portraint豎屏。
                                     默認值portraint。無論是直播還是全屏H5一般都是豎屏播放,
                                     但是這個屬性需要x5-video-player-type開啟H5模式
-->

 

自動播放

  • 設置autoplay屬性
  • <video autoplay></video>
  • 移動瀏覽器中

但是在很多移動瀏覽器里,都是要求用戶的真實操作來(touchend、click、doubleclick 或 keydown 事件等標准的事件)觸發調用video.play(),才能自動播放影音視頻。

 dom.addEventListener('click', function () {
   video.play()
})
  • 微信中

也可以在 wx.ready()里觸發video.play()

wx.ready(function () {
  video.play()
})

  

內聯播放

  • 設置屬性 webkit-playsinline playsinline
  • <video id="video" webkit-playsinline playsinline /></video>
    

      

在iOS Safari和一些安卓的一些瀏覽器下播放視頻的時候,不能在h5頁面中播放視頻,系統會自動接管視頻

如果需要在h5頁面內播放視頻,需要在視頻標簽上加上 webkit-playsinline,在iOS10以后,需要加上playsinline,建議同時加上這兩個屬性。同時還需要app支持這種模式

webview.allowsInlineMediaPlayback = YES;

  

ios手Q和微信都支持這種模式,但是android 微信就掛了

  • android 微信

android微信內置瀏覽器采用騰訊X5內核,不遵循X5web標准,video強制全屏就是其一。視頻播放完畢后還會出現QQ自己的視頻推薦

據說,其有個白名單,白名單下的視頻資源,就不會全屏。但是騰訊已經不能再增加白名單了。尿性,無解。。。。。。

目前還有一個解決辦法,就是使用h5 canvas 播放 video

  • canvas 播放視頻

使用canvas 遇到的坑:video 必須加 x5-video-player-type="h5" 屬性,否則,在移動端就會卡死不能播放視頻,個人認為是因為視頻被接管的原因導致。

<div class="wrapper">
  <video id="video" style="display: none" autoplay src="video.mp4" x5-video-player-type="h5"></video>
  <canvas id="canvas"></canvas>
</div>
<script>
  var video = document.querySelector('#video')
  var canvas = document.querySelector('#canvas')
  var wrapper = canvas.parentNode
  var width = wrapper.offsetWidth
  var height = wrapper.offsetHeight
  var ctx = c.getContext('2d')
  var time = null
  canvas.width = width
  canvas.height = height

  canvas.addEventListener('click', function () {
    video.play()
  })

  video.addEventListener('play', function () {
      time = window.setInterval(function () {
        ctx.drawImage(v, 0, 0, width, height);
      }, 20);
  }, false);

  video.addEventListener('pause', function () {
      window.clearInterval(time);
  }, false);

  video.addEventListener('ended', function () {
      window.clearInterval(time);
  }, false);
</script>

  

最后發現,雖然使用canvas播放視頻,android微信中可以屏蔽全屏視頻播放完的推薦視頻。但是還沒辦法禁止視頻播放時 的全屏問題。還是得萬惡的白名單。吐槽。。。。。。。。。。。。。。。。
更坑爹的是沒有找到js觸發退出全屏的方法。

ios黑屏問題

ios 在播放視頻時,會出現短暫的黑屏,然后正常顯示。

解決方法:

在視頻上層覆蓋一個 添加一個div並用一張圖片填充,制造播放前加載假象。然后監聽事件 timeupdate ,視頻播放有畫面時移除這個“div塊”

video.addEventListener('timeupdate', function(){ if(video.currentTime > 0.1){ posterImg.hidden(); } }) 

Media 方法和屬性

HTMLVideoElement和HTMLAudioElement 均繼承自HTMLMediaElement

// 媒體錯誤 MediaObj.error; //null:正常 MediaObj.error.code; //1.用戶終止 2.網絡錯誤 3.解碼錯誤 4.URL無效 //媒體當前狀態 MediaObj.currentSrc; //返回當前資源的URL MediaObj.src = value; //返回或設置當前資源的URL MediaObj.canPlayType(type); //是否能播放某種格式的資源 MediaObj.networkState; //0.此元素未初始化 1.正常但沒有使用網絡 2.正在下載數據 3.沒有找到資源 MediaObj.load(); //重新加載src指定的資源 MediaObj.buffered; //返回已緩沖區域,TimeRanges MediaObj.preload; //none:不預載 metadata:預載資源信息 auto: //准備狀態 MediaObj.readyState;//1:HAVE_NOTHING //2:HAVE_METADATA //3.HAVE_CURRENT_DATA //4.HAVE_FUTURE_DATA //5.HAVE_ENOUGH_DATA MediaObj.seeking; //是否正在seeking //回放狀態 MediaObj.currentTime = value; //當前播放的位置,賦值可改變位置 MediaObj.startTime; //一般為0,如果為流媒體或者不從0開始的資源,則不為0 MediaObj.duration; //當前資源長度 流返回無限 MediaObj.paused; //是否暫停 MediaObj.defaultPlaybackRate = value;//默認的回放速度,可以設置 MediaObj.playbackRate = value;//當前播放速度,設置后馬上改變 MediaObj.played; //返回已經播放的區域,TimeRanges,關於此對象見下文 MediaObj.seekable; //返回可以seek的區域 TimeRanges MediaObj.ended; //是否結束 MediaObj.autoPlay; //是否自動播放 MediaObj.loop; //是否循環播放 MediaObj.play(); //播放 MediaObj.pause(); //暫停 //視頻控制 MediaObj.controls;//是否有默認控制條 MediaObj.volume = value; //音量 MediaObj.muted = value; //靜音 //TimeRanges(區域)對象 TimeRanges.length; //區域段數 TimeRanges.start(index) //第index段區域的開始位置 TimeRanges.end(index) //第index段區域的結束位置 //【★★★**相關事件**★★★】 //事件分發 var eventTester = function(e){ Media.addEventListener(e,function(){ console.log((new Date()).getTime(),e) },false); } //事件監聽 eventTester("loadstart"); //客戶端開始請求數據 eventTester("progress"); //客戶端正在請求數據 eventTester("suspend"); //延遲下載 eventTester("abort"); //客戶端主動終止下載(不是因為錯誤引起) eventTester("loadstart"); //客戶端開始請求數據 eventTester("progress"); //客戶端正在請求數據 eventTester("suspend"); //延遲下載 eventTester("abort"); //客戶端主動終止下載(不是因為錯誤引起), eventTester("error"); //請求數據時遇到錯誤 eventTester("stalled"); //網速失速 eventTester("play"); //play()和autoplay開始播放時觸發 eventTester("pause"); //pause()觸發 eventTester("loadedmetadata"); //成功獲取資源長度 eventTester("loadeddata"); // eventTester("waiting"); //等待數據,並非錯誤 eventTester("playing"); //開始回放 eventTester("canplay"); //可以播放,但中途可能因為加載而暫停 eventTester("canplaythrough"); //可以播放,歌曲全部加載完畢 eventTester("seeking"); //尋找中 eventTester("seeked"); //尋找完畢 eventTester("timeupdate"); //播放時間改變 eventTester("ended"); //播放結束 eventTester("ratechange"); //播放速率改變 eventTester("durationchange"); //資源長度改變 eventTester("volumechange"); //音量改變

移動端 HTML5 <video> 視頻播放優化實踐

一些常用且需要重點關注的<video>事件
event iOS Android
play 只是要播放視頻,響應的是video.play()方法,並不代表已經開始播放 和iOS一樣,僅是響應video.play()方法
durationchange 會執行一次,一定會獲取到視頻的duration 可能會執行多次,只有最后一次才能獲取到真實的duration,前面的duration都是0;但低版本Android可能獲取到的duration是0或1;(本文提到的低版本Android大部分是4.1以下)
canplay 可以認為是視頻元素沒有問題,可以運行,沒有更多含義了,基本用不上 同iOS
canplaythrough 會有明確的緩沖,表示可以流暢播放了; 沒有什么用,視頻仍然會卡住,數據可能還沒有開始加載;
playing 明確表示播放開始了; 依然沒有用,視頻可能並沒有開始播放;
progress 有明確的下載,可以獲取到當前的buffer,並且全部下載完畢后不在觸發; 不一定有明確的數據下載,並且全部下載完畢后依然繼續觸發;
timeupdate 會有明確的進度變化,可以獲取到currentTime; 進度不一定變化,currentTime可能總是0,但是第一次有currentTime變化的timeupdate事件一定代表了視頻開始播放了;
error iOS中會有明確的錯誤拋出; Android中某些瀏覽器會莫名其妙的拋出error;
stalled 網絡狀況不佳,導致視頻下載中斷; 在沒有play之前,也可能會拋出該事件。

屬性差異

attributes iOS android
poster
封面圖片
支持,但是加載速度明顯比在<img>中要慢; 不一定支持(瀏覽器廠商的實現標准不統一);
preload
預加載
iPhone不支持; 可能支持;
autoplay
自動播放
iPhone Safari中不支持,但在webview中可能被開啟;iOS開發文檔明確說明蜂窩網絡下不允許autoplay; 可能支持;
loop
循環播放
支持 可能支持;
controls
控制條
支持,但是需要開始播放了才顯示 基本都支持顯示或者不顯示
width和height 一定給出明確的屬性設置,切不能為0; 如果不設置,僅僅通過CSS樣式去控制視頻大小,可能會導致

其他怪異bug和不友好表現

iOS android
物理位置覆蓋在<video>區域上的元素,click和touch等事件會失效,比如一個<a>鏈接如果覆蓋在<video>上,那么點擊后沒有任何效果。 -
iOS8.0+中,單頁面播放視頻超過16個,再播放的視頻全部MediaError解碼異常無法播放。 -
iPhone的Safari會彈出一個全屏的播放器來播放視頻,iPad則支持內聯播放。iOS7+ 如果webview(比如微信)開啟了webview.allowsInlineMediaPlayback = YES;,可以通過設置webkit-playsinline屬性支持內聯播放; 支持內聯播放,但某些廠商會用自己的播放器劫持原生的視頻播放;
下載視頻時,會先發送一個2字節的請求來獲取視頻元數據(比如時長),然后再不斷的發送分包續傳(206)請求來下載視頻,抓包顯示請求數和請求量至少有一倍的冗余(x2),這個嚴重的bug在iOS8中有明顯的修復,但是分包的206請求仍然會有冗余數據的下載,浪費了流量。 比iOS的處理方式好,沒有第一個2字節請求,沒有流量損耗;
- 低版本Android(<=4.0.4)中,<video>如果在有相對和決定定位的層中,可能會導致整個頁面錯位。
- 某些瀏覽器廠商會劫持<video>,用其“自己”的播放器來播放視頻,“破壞”了產品本身的播放體驗,那么只能case by case的解決了。
加載視頻時沒有進度提示,視覺上看不出是播放完了還是卡住了; 加載視頻時,大都會顯示一個自帶的loading UI(菊花)。

最佳實踐

視頻初始化

如果將一個<video>直接顯示在頁面中,那么就會看到各種五花八門的播放器初始效果;

五花八門的播放器初始效果

這顯然不是一個好的視覺體驗,那么通常的做法是制作一個模擬的視頻播放視圖,比如一個封面加一個播放按鈕。

而真實的<video>視頻元素要隱藏起來,如何隱藏呢?最好不要用{display: none}或者{width:0;height:0;}的方式,因為這樣視頻元素會處於未激活的狀態,給后續的處理帶來麻煩。最佳的方式是將視頻設置成1x1像素大小,放在視覺邊緣的位置。

<!--iOS--> <video webkit-playsinline width="1" height="1" class="vplayinside notaplink" x-webkit-airplay controls loop="loop" src="<%=src%>"></video> <!--Android--> <video width="1" height="1" controls loop="loop" src="<%=src%>"></video> 

default

自動播放

autoplay的支持依賴內核和網絡狀況,比如iPhone在蜂窩網絡下明確禁用了autoplay;

經過試驗,在沒有明確的用戶操作的情況下,直接通過video.play()也是無法激活播放的;

並且在產品設計上,自動播放也不是一個舒服的用戶體驗,所以產品設計上盡量避免使用自動播放。

點擊播放

之前提到,視頻最好通過1px大小隱藏起來,那么這時如何觸發播放呢?

經過試驗,當在明確的用戶操作(touch、click)時,通過這些用戶行為事件的回調函數,用video.play()是可以觸發視頻播放的,那么能否在用戶操作后,再去同步的創建和播放視頻呢?答案是肯定的,這無疑是一個視頻元素初始化的最佳實踐,但是有些差異需要注意。

iOS6+

可以在用戶的touch時間中動態創建並播放視頻。

iOS < 6

可以在用戶的touch時間中動態創建視頻,但不能播放;要再追加一個click事件來啟動播放;也就是說,給偽造的視頻播放按鈕同時綁定tap和click事件,在tap的時候創建,在之后300毫秒的click中去播放。

Android

大部分高版本Android可以像iOS6+那樣去處理,但是低版本的不行,必須要通過click事件去傳遞video.play(),為了保持兼容,最好是用幫tap和click兩個事件來分別完成視頻的初始化和播放。

我們還發現,有些低版本Android中,無法通過video.play()來播放視頻,必須有真實的用戶點擊視頻元素才能播放;這種情況,有一個技巧就是在tap的時候初始化並放大視頻覆蓋在播放視圖中,讓300毫秒后的真實點擊行為穿透點擊在視頻元素上來實現播放。

循環播放

如果視頻需要循環播放,那么就增加loop屬性,是否能循環播放就看瀏覽器是否支持了,因為還沒有找到hack技巧來強制循環播放;

即使,在不支持循環播放的Android中,通過監聽seeked事件知道了播放進度到了終點或起點暫停了,此時也無法通過video.play()來讓視頻重新播放。

監控下載進度

如何獲取視頻時長和已經下載的時長?

// 視頻時長 var duration = video.duration // 獲取視頻已經下載的時長 function getEnd(video) { var end = 0 try { end = video.buffered.end(0) || 0 end = parseInt(end * 1000 + 1) / 1000 } catch(e) { } return end } 

progress事件表示視頻在加載,但是它的觸發頻率和時機並不規律,最佳做法是通過一個定時器去實時獲取end,當end >= duration時,表示已經下載完畢,再終止定時器。

 

一款全兼容的播放器 videojs
[官網]http://www.videojs.com/

videojs就提供了這樣一套解決方案,他是一個兼容html5的視頻播放工具,早期版本兼容所有瀏覽器,方法是:提供三個后綴名的視頻,並在不支持html5的瀏覽器下生成一個flash的版本。

最新的版本
下載-5.8.0-releases版本

目錄結構
video.js/
├── alt
│ ├── video.novtt.js
│ ├── video.novtt.min.js
│ └── video.novtt.min.js.map
├── examples/
├── font
│ ├── VideoJS.eot
│ ├── VideoJS.svg
│ ├── VideoJS.ttf
│ └── VideoJS.woff
├── ie8
│ ├── videojs-ie8.js
│ └── videojs-ie8.min.js
├── lang/
├── video-js-5.8.0.zip
├── video-js.css
├── video-js.min.css
├── video-js.swf
├── video.js
├── video.js.map
├── video.min.js
└── video.min.js.map

引用腳本,videojs很為你着想,直接cdn了,你都不需要下載這些代碼放入自己的網站

<link href=”http://vjs.zencdn.net/c/video-js.css” rel=”stylesheet”>
<script src=”http://vjs.zencdn.net/c/video.js”></script>
1
2
如果需要支持IE8,這個js可以自動生成flash

<!-- If you'd like to support IE8 -->
<script src="http://vjs.zencdn.net/ie8/1.1.2/videojs-ie8.min.js"></script>
1
2
頁面中加入一個html5的video標簽

<video id="my_video_1" class="video-js vjs-default-skin"
controls preload="auto" width="640" height="264" poster="my_video_poster.png" data-setup="{}">
<source src="my_video.mp4" type="video/mp4">
<source src="my_video.webm" type="video/webm">
</video>

其中post就是視頻的縮略圖,那倆source一個指向mp4視頻,一個指向webm視頻,在頁面加載過程中,video.js會判斷瀏覽器支持哪個格式視頻,會自動加載可播放的視頻。
簡單吧!

進階:使用api
獲取對象:
后面那個就是就是video標簽的id值,這是myPlayer就是播放器對象了。

videojs("my-video").ready(function(){
window.myPlayer = this;
// EXAMPLE: Start playing the video.
myPlayer.play();
});

方法:
獲取對象

var videoObj = videojs(“videoId”);

ready:

myPlayer.ready(function(){
//在回調函數中,this代表當前播放器,
//可以調用方法,也可以綁定事件。
})

播放:

myPlayer.play();

暫停:

myPlayer.pause();

獲取播放進度:

var whereYouAt = myPlayer.currentTime();

設置播放進度:

myPlayer.currentTime(120);

視頻持續時間,加載完成視頻才可以知道視頻時長,且在flash情況下無效

var howLongIsThis = myPlayer.duration();

緩沖,就是返回下載了多少

var whatHasBeenBuffered = myPlayer.buffered();

百分比的緩沖

var howMuchIsDownloaded = myPlayer.bufferedPercent();

聲音大小(0-1之間)

var howLoudIsIt = myPlayer.volume();

設置聲音大小

myPlayer.volume(0.5);

取得視頻的寬度

var howWideIsIt = myPlayer.width();

設置寬度:

myPlayer.width(640);

獲取高度

var howTallIsIt = myPlayer.height();

設置高度:

myPlayer.height(480);

一步到位的設置大小:

myPlayer.size(640,480);

全屏

myPlayer.enterFullScreen();

離開全屏

myPlayer.enterFullScreen();

添加事件
durationchange
ended //播放結束
firstplay
fullscreenchange
loadedalldata
loadeddata
loadedmetadata
loadstart
pause //暫停
play //播放
progress
seeked
seeking
timeupdate
volumechange
waiting
resize inherited

var myFunc = function(){
// Do something when the event is fired
};

事件綁定
myPlayer.on("ended", function(){
console.log("end", this.currentTime());
});
myPlayer.on("pause", function(){
console.log("pause")
});

刪除事件

myPlayer.removeEvent(“eventName”, myFunc);
1
雖然文章說明在不支持html5的情況下,會以flash播放,但在支持html5的firefox下播放mp4時,卻遇到很大的困難,雖然調用了flash,但一直無法播放(不過我也一直懷疑我的firefox下的flash有問題,不知道是不是真的)。不過如果你聽從videojs的建議,放兩個格式的視頻,就不會有這個問題了。

另外video的寫法中還有專門針對flash的寫法,當然你也可以用這個插件實現純粹的flash播放(只寫flash那部分就好,可以保證統一的瀏覽效果,不過ios的瀏覽器不兼容flash,這就要你自己進行判斷來處理

一個播放器demo
————————————————
版權聲明:本文為CSDN博主「ly115176236」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ly115176236/article/details/50977127



 
 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM