1. 程式人生 > >一款開源免費跨瀏覽器的視訊播放器--videojs使用介紹

一款開源免費跨瀏覽器的視訊播放器--videojs使用介紹

       最近專案中的視訊功能,需要做到瀏覽器全相容,所以之前用html5實現的視訊功能就需要進行改造了。在網上翻了個遍,試來試去,在所有的視訊播放器中,就數它最實際了。首先我們來看看它的優點:

     1.它是開源免費的,你可以在github很容易的獲取它的最新程式碼。

     2.使用它非常的容易,只要花幾秒鐘就可以架起一個視訊播放頁面。

     3.它幾乎相容所有的瀏覽器,並且優先使用html5,在不支援的瀏覽器中,會自動使用flash進行播放。

     4. 介面可以定製,純javascript和css打造。說明文件也非常的詳細。

下面是官網提供的一個簡單的使用方法:

<!DOCTYPE HTML>
<html>
<head>
  <title>Video.js Test Suite</title>
<link href="//vjs.zencdn.net/4.10/video-js.css" rel="stylesheet">
<script src="//vjs.zencdn.net/4.10/video.js"></script>
 
</head>
<body>
 <video id="example_video_1" class
="video-js vjs-default-skin" controls width="640" height="264">
 <source src="http://video-js.zencoder.com/oceans-clip.mp4" type='video/mp4' />
</video> 
</body>
</html>

 這樣個例子對於想用它做一個電影網站來說夠用了。可是我們的需求往往不會只是這麼簡單。比如我現在要強制在pc端使用flash播放要怎麼設定?

有兩種途徑:

   先說第一種,通過html的data-setup 屬性進行設定。

<video id="example_video_1" class="video-js vjs-default-skin vjs-big-play-centered"
  controls preload="auto" width="640" height="264"
  poster="http://video-js.zencoder.com/oceans-clip.png"
  data-setup='{ techOrder: ["flash","html5"]}'>
  ...
</video>

第二種就是使用javascript:

  videojs('#example_video_1',{
    techOrder: ["flash","html5"]
  },function() {
  
  })

當然,官方的文件說,在內部會自動檢測是否支援html5,在不支援的情況下會自動使用flash播放。 

隨著單頁應用的流行,很多時候,我們在初始化videojs的時候,頁面上是不存在存放video的節點的。這個時候,videojs也替我們想到了,我們只需要置空data-setup的屬性就可以了。然後在js中進行如下申明:

videojs(document.getElementById('example_video_1'), {}, function() {
  // This is functionally the same as the previous example.
});

也就是說,第一個位置,我們直接傳dom節點的引用也是可以的。

這時候我們發現,播放按鈕預設是在左上角,官方說這樣可以不會遮擋內容的精彩部分,但是如果我們想要放到中間,處理也很簡單。在video標籤中增加一個vjs-big-play-centered樣式就好了

<video id="example_video_1" class="video-js vjs-default-skin vjs-big-play-centered"
  controls preload="auto" width="640" height="264"
  poster="http://video-js.zencoder.com/oceans-clip.png"
  data-setup='{"example_option":true}'>
  ...
</video>

如果我們想要它自動播放,非常容易,加一個autoplay 就可以了,或者data-setup='{"autoplay":true}' ,通過js也是一樣的道理。非常簡單就不演示了。官方說了,由於html5的標準,不建議寫成autoplay="true" 或 controls="true",那是html5之前的版本用的。

預設的控制欄會有許多我用不需要用到的元件,比字幕什麼的,為了優化,我們可以定義要顯示的元件:

var player = videojs("example_video_1", {
    "techOrder": ["flash","html"],
    "autoplay":false,
    controlBar: {
        captionsButton: false,
        chaptersButton : false,
        liveDisplay:false,
        playbackRateMenuButton: false,
        subtitlesButton:false
      }

}, function(){

    this.on('loadeddata',function(){
        console.log(this)
    })

    this.on('ended',function(){
         this.pause();
         this.hide()
    })

});

我們優化是針對option,因為有些節點我們不需要建立,預設是建立的,這顯然會影響效率,以下是我專案中的一個使用情況:

videojs('example_video_1',{
        techOrder : ["html5","flash"],
        children : {
            bigPlayButton : false,
            textTrackDisplay : false,
            posterImage: false,
            errorDisplay : false,
            controlBar : {
                captionsButton : false,
                chaptersButton: false,
                subtitlesButton:false,
                liveDisplay:false,
                playbackRateMenuButton:false
            }
        }
    },function(){
        console.log(this)
    });

對照一下dom節點,少了一大堆,感覺啟動明顯快了許多。看著也清爽了。

 

列印this看下:

兩者是一至的,共有9個物件,於是生成了9個節點,外部只有3個子元素。預設的控制部分會生成14個,外部9個子元素。優化效果非常明顯。

初始化的時候,常用的有如下一些引數:

autoplay

自動播放

<video autoplay ...>
or
{ "autoplay": true }

preload

預載入資源

<video preload ...>
or
{ "preload": "auto" }

poster

視訊縮圖

<video poster="myPoster.jpg" ...>
or
{ "poster": "myPoster.jpg" }

loop

自動迴圈

<video loop ...>
or
{ "loop": "true" }

width

The width attribute sets the display width of the video.

<video width="640" ...>
or
{ "width": 640 }

height

The height attribute sets the display height of the video.

<video height="480" ...>
or
{ "height": 480 }

Component Options

功能元件(例中演示如何移除靜音按鈕)

var player = videojs('video-id', {
  controlBar: {
    muteToggle: false
  }
});

 videojs 有許多的元件,比如聲音,播放按鈕,字幕,時間,進度條等等,它們在html中的結構類似於這樣子:

Player
    PosterImage
    TextTrackDisplay
    LoadingSpinner
    BigPlayButton
    ControlBar
        PlayToggle
        FullscreenToggle
        CurrentTimeDisplay
        TimeDivider
        DurationDisplay
        RemainingTimeDisplay
        ProgressControl
            SeekBar
              LoadProgressBar
              PlayProgressBar
              SeekHandle
        VolumeControl
            VolumeBar
                VolumeLevel
                VolumeHandle
        MuteToggle

通常html5會比flash載入的更快,所以我們通常優先使用html5,同時把我們要進行的操作寫在回撥裡邊。比如:

videojs("example_video_1").ready(function(){
  var myPlayer = this;

  // EXAMPLE: Start playing the video.
  myPlayer.play();

});

需要強調的是,如果使用flash優先,那麼你在本地調式的時候,要用http的方式訪問,否則你什麼也看不到。

METHODS

autoplay
buffered
bufferedEnd
bufferedPercent
cancelFullScreen deprecated
controls
currentSrc
currentTime
currentType
dispose //清理
duration
ended //結束
error //錯誤
exitFullscreen //退出全屏
init
isFullScreen deprecated 廢棄
isFullscreen
language
load
loop //迴圈
muted 靜音
pause 暫停
paused //檢測是否暫停的狀態
play
playbackRate
poster //靜態圖片
preload
remainingTime //餘下時間
requestFullScreen deprecated
requestFullscreen
seeking
src
volume
addChild inherited
addClass inherited
buildCSSClass inherited
children inherited
contentEl inherited
createEl inherited
dimensions inherited
el inherited
enableTouchActivity inherited
getChild inherited
getChildById inherited
hasClass inherited
height inherited
hide inherited
id inherited
initChildren inherited
name inherited
off inherited
on inherited
one inherited
options inherited
player inherited
ready inherited
removeChild inherited
removeClass inherited
show inherited
trigger inherited
triggerReady inherited
width inherited

這裡我說一下幾個常用的方法:清理 dispose,hide() 隱藏,show() 顯示,play()播放,pause(), el()獲取video元素 ,暫停 幾本上就差不多了。

最後要說一下的就是事件。官方提示的事件如下:

EVENTS

durationchange
ended
firstplay
fullscreenchange
loadedalldata
loadeddata
loadedmetadata
loadstart
pause
play
progress
seeked
seeking
timeupdate
volumechange
waiting
resize inherited

我們常用的有play播放,pause暫停,ended結束,error錯誤, loadeddata資料載入完成

videojs的外掛機制,我以在播放器的控制條中新增一個關閉按鈕為例,展示如果使用外掛實現我們自己想要的功能。

videojs.PowerOff = videojs.Button.extend({
              /* @constructor */
               init: function(player, options){

                 videojs.Button.call(this, player, options);
                 //onClick為預設事件,不需要人為邦定,否則會調兩次
                 //this.on('click', this.onClick);
               }
             });

            /* This function is called when X button is clicked */
            videojs.PowerOff.prototype.onClick = function() {
                console.log('ddd')
//這裡新增做你想要乾的事情 };
/* Create X button */ var createPowerOffButton = function() { var props = { className: 'vjs-off-button vjs-control', innerHTML: '<div class="vjs-control-content">X</div>', role: 'button', 'aria-live': 'polite', tabIndex: 0 }; return videojs.Component.prototype.createEl(null, props); }; /* Add X button to the control bar */ var X; videojs.plugin('PowerOff', function() { var options = { 'el' : createPowerOffButton() }; X = new videojs.PowerOff(this, options); this.controlBar.el().appendChild(X.el()); });

呼叫的時候,引數要加上外掛的名稱:

var player = videojs("example_video_1", {
      plugins : { PowerOff : {} }
}, function(){
    
});

看到我們新增的“X” 了沒有?什麼,你的X是在中間?忘了告訴你,這個地方的樣式要自己加上,我的是這樣的

.vjs-default-skin .vjs-control.vjs-off-button {
         display: block;
         font-size: 1.5em;
         line-height: 2;
         position: relative;
         top: 0;
         float:right;
         left: 10px;
         height: 100%;
         text-align: center;
         cursor: pointer;
         }

是不是相當的nice呀。

在實踐中,我發現flash模式和html5模式還是有一些不一致的地方。

比如在flash模式中,在播放器暫停或隱藏之後,呼叫paused()方法報錯:VIDEOJS: Video.js: paused unavailable on Flash playback technology element.

呼叫hide()之後,呼叫show()方法,在flash模式中,會自動呼叫播放,而且是重新開始,而html5模式則不會。對於這一點,解決的辦法是在option中指定autoplay:false,這樣兩者行為就一致了。

使用videojs我發現有幾個地方是要注意的:

1:在iframe載入的頁面中,全屏按鈕是無效的。當然後來證實不是videojs的問題,是iframe要加allowfullscreen 屬性才行。

2:在flash模式下有太多的問題,比哪重複呼叫pause()會報錯,在hide()之後呼叫paused()會報錯。

3:在flash模式下不要試圖使用audio去播放音訊,雖然有外掛可以支援,但是問題很多。html5模式下本人沒有測試。

videojs 在flash模式下,以下情況有衝突:
1. video 在播中呼叫hide()會導致內部錯誤,如果先呼叫了pause()和hide(),再呼叫pause()同樣會導致內部錯誤。類似的情況還有呼叫dispose()
2. 在video是hide的情況下,去呼叫paused()會產生內部錯誤
3. 在hide的狀態下,呼叫show()再呼叫play會產生內部錯誤
4. 在檔案不存在的情況下,如果不呼叫dispose會產生內部錯誤。

綜上所述,對於單頁應用,videojs在隱藏時,內部的狀態就存在丟失的情況,會導致一系列的問題。解決的辦法就是播一次就建立一次。關閉就清理。經測試,這種模式就再也不會有錯誤了

 僅管如此,作為一個開源免費的產品,已經是相當不錯了。

相關推薦

開源免費瀏覽器視訊播放--videojs使用介紹

       最近專案中的視訊功能,需要做到瀏覽器全相容,所以之前用html5實現的視訊功能就需要進行改造了。在網上翻了個遍,試來試去,在所有的視訊播放器中,就數它最實際了。首先我們來看看它的優點:      1.它是開源免費的,你可以在github很容易的獲取它的最新程式碼。      2.使用它非常的

【轉】開源免費瀏覽器的視頻播放--videojs使用介紹

med padding 網站 最新代碼 html 但是 videojs let live 特別提示:本人博客部分有參考網絡其他博客,但均是本人親手編寫過並驗證通過。如發現博客有錯誤,請及時提出以免誤導其他人,謝謝!歡迎轉載,但記得標明文章出處:http://www.cnb

開源免費的WPF圖表控制元件ModernuiCharts

一款簡潔好看的Chart控制元件  支援WPF、silverlight、Windows8  ,基本夠用,主要是開源免費的。(商業控制元件ComponentOne for WPF要4w多呢) This project provides a small library to display charts in 

免費視訊播放videojs中文教程

Video.js是一款web視訊播放器,支援html5和flash兩種播放方式。更多關於video.js的介紹,可以訪問官方網站介紹,我之前也寫過一篇關於video.js的使用心得,有興趣的可以點這裡 , 閱讀的人數還蠻多的,有些熱心的讀者甚至還給過我小額打賞,錢雖不多,但是很感動。最幾天又收到幾位網友的私信

7很棒的 HTML5 視訊播放

作為下一代的網頁語言,HTML5 擁有很多讓人期待已久的新特性,其中之一就是 video 標籤,讓開發者可以在網頁中和新增圖片一樣簡單的方式新增視訊。在這篇文章中,我收集了7個很棒的HTML5視訊播放器,你可以很容易的應用到你的網站中,文章最後還將與大家分享使用 CSS3

HTML5的視訊播放videojs

        html5的標準還沒有最終確定,但關於視訊播放器的標準基本上被卡住了。mazilla和Opera由於沒有H264的版權,堅持不支援H264標準的mp4格式視訊,只支援ogg和webm兩種格式,其中webm是谷歌去年提供的一個新的標準,並將該格式開源;ogg似乎是早期的一種手機視訊的格式,

【原創】關於視訊播放如何做到邊播邊快取?【如何用Vitamio做功能強大的視訊播放補充篇】

上一篇介紹了怎樣做一款功能強大的視訊播放器,是基於Vitamio框架開發的。這裡我們再補充一個功能:如何做到視訊邊播放邊快取到本地? 這個需求還挺常見的。由於使用者的網路環境複雜,經常會有網速較慢看視訊時卡頓、緩衝的現象,並且有時候我們需要頻繁的拖拽進度條,如果播放的是

[轉載]分享10最棒的免費HTML5視訊播放

最近Web圈子裡最讓人激動地莫過於HTML5了,特別是HTML5視訊,使用HTML5視訊標籤可以幫助我們解決困擾我們很長時間的網站視訊插入問題。 HTML5可以在沒有flash的情況下播放視訊。現在有很多的漂亮HTML5視訊播放介面,包括控制元素,所以你不需要其它的東

推薦基於Java的音視訊處理開源專案--JAVE

http://blog.csdn.net/softwave/article/details/5819699 JAVE(Java Audio Video Encoder),是一款將音訊和視訊在不同格式間進行轉化的工具,是基於ffmpeg專案的Java封裝。 JAVE,

android 音樂視訊播放(github上十二最著名的Android播放開源專案)

1.ijkplayer 專案地址: https://github.com/Bilibili/ijkplayer 介紹:Ijkplayer 是Bilibili釋出的基於 FFplay 的輕量級 Android/iOS 視訊播放器。實現了跨平臺功能,API 易於整合;編譯配置

推薦基於Java的音視訊處理開源專案 JAVE

                JAVE(Java Audio Video Encoder),是一款將音訊和視訊在不同格式間進行轉化的工具,是基於ffmpeg專案的Java封裝。JAVE,需要J2SE 1.4+、Windows 或 Linux 作業系統均可執行。JAVE支援的編碼和解碼格式見下表:Decodi

開源恢復工具——scalpel

使用 損壞 來看 lin .exe 不能 目的 源代碼 src scalpel是一款命令行工具,雖然是在linux環境下開發,但也可以在Windows下使用。scalpel的實現原理和foremost很相似,但是他較之foremost做了一些改進。   sca

android黑科技系列——破解永久免費網絡訪問工具

大神 oot 有效期 發布 前言 expired 日誌信息 轉折 expire 一、前言 因為最近個人需要,想在手機上使用“高級搜索”,但是找了一圈發現都是需要收費的網絡工具,奈何我沒錢,所以只能通過專業技能弄一個破解版的。 二、應用分析 下面

lylmwt推薦] 五開源免費的建站系統推薦

msm bdd pbd dad body htm rdp god key ph5z55姓濟傭夜鎢綻http://blog.sina.com.cn/s/blog_17ba660cd0102x3xu.htmldbb7nl究擺蘋嚴誒渦http://blog.sina.com.cn

我們到底選擇哪開源的Socket框架?

C# .NET Socket FastSocket SuperSocket 一、摘要FastSocket(簡稱:FS)突出:簡單靈活、上手容易。SuperSocket(簡稱:SS)突出:功能豐富、擴展強大。二、FS和SS擺在我們的面前,那麽我們應該選擇哪一個玩呀?2.1、什麽是FastSo

記錄開源數據同步工具syncthing

同步工具最近在為些共有雲遷移的問題而頭痛,數據的不間斷同步成為了需要考慮的首要問題,如何能夠更加便利的幫助我們完成這項工作呢?Sync,sync,syncsomething,無意間發現這款貌似已經很流行的軟件(只可惜我剛註意到它,還好為時不晚)。我迫不及待的自己安裝測試了下,效果很好,大概總結有以下優點: 1

萬能視訊格式轉換功能強大的全能視訊格式轉換軟體,支援多種視訊格式轉換。萬能視訊轉換可以將R

萬能視訊格式轉換器是一款功能強大的全能視訊格式轉換軟體,支援多種視訊格式轉換。萬能視訊轉換器可以將RM、RMVB、AVI、WMV、MPG 、MPEG、FLV、3GP、MP4、SWF、ASF、DIVX、XVID、3GP2、FLV1、MPEG1、MPEG2、MPEG3、MPEG4、H264等視訊格式轉換,用於各種

瀏覽器網頁播放RTSP技術研究-未完待續

目標: 希望Web瀏覽器能播放RTSP流,最好跨瀏覽器,最低要求是支援IE。   簡單調查結論: 外掛技術真的是飽受排斥! 無外掛技術只支援新的瀏覽器,且資料相對少! 暫時找不到一個跨平臺,穩定,效能好,且資料多的瀏覽器技術! IE的Activex在安防行業

段蛋疼的程式碼:超不清視訊播放

今天分享的這段程式碼,看起來沒啥實際用處,而且有些反潮流,因為現如今大家看視訊都追求更高解析度的超清畫質,而我們這個,是一個“超不清”的視訊播放器: 在控制檯裡播放視訊,用字元來表示畫面 不過我覺得它至少可以有三個作用:1.用來練習視訊和影象處理的程式設計開發;2.在沒有圖形介面的伺服器上播

安卓視訊播放——ijkPlayer(Bilibili開源

作為一個B站(Bilibili)使用者,特別喜歡B站的播放器 湊巧,發現了b站的github的地址。。嘿嘿。。B站github地址f 發現了ijkplayer播放器,支援android 和ios 我們用AndroidStudio新建project名字是bilibili_ijkplay