使用videojs轻松搭建一个播放器

之前在项目中有视频播放的这样一个需求,它需要:
1.播放器不采用默认样式,重新设计;
2.兼容IE浏览器
3.后续增加字幕、清晰度等功能
总的看来,若是重新全部自己去写这些功能,是很耗费时间和人力的。所以找到了videojs这样一个可以满足我们所有要求的js库。下面总结下使用这个库时的一些经验。
一、入门
videojs可以让我们很迅速便捷地搭建出一个兼容各浏览器的视频播放器。代码如下。

<head>
  <link href="http://vjs.zencdn.net/6.2.0/video-js.css" rel="stylesheet">

  <!-- If you'd like to support IE8 -->
  <script src="http://vjs.zencdn.net/ie8/1.1.2/videojs-ie8.min.js"></script>
</head>

<body>
  <video id="my-video" class="video-js" controls preload="auto" width="640" height="264"
  poster="MY_VIDEO_POSTER.jpg" data-setup="{}">
    <source src="MY_VIDEO.mp4" type='video/mp4'>
    <source src="MY_VIDEO.webm" type='video/webm'>
    <p class="vjs-no-js">
      To view this video please enable JavaScript, and consider upgrading to a web browser that
      <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>
    </p>
  </video>

  <script src="http://vjs.zencdn.net/6.2.0/video.js"></script>
</body>

类名须加上“video-js”,若想要兼容IE8的话,则引入的js文件为videojs-ie8.min.js,否则为video.js。

二、播放器组件与初始化
默认支持的组件有以下这些:

Player
    PosterImage   //默认封面
    TextTrackDisplay
    LoadingSpinner
    BigPlayButton    //大播放按钮
    ControlBar    // 控制条
        PlayToggle   //播放暂停
        FullscreenToggle   //全屏
        CurrentTimeDisplay   //当前播放时间
        TimeDivider
        DurationDisplay
        RemainingTimeDisplay   //剩余播放时间
        ProgressControl   //时间轴
               SeekBar
               LoadProgressBar
               PlayProgressBar
               SeekHandle
        VolumeControl   //音量控制
              VolumeBar
              VolumeLevel
              VolumeHandle 
       PlaybackRateMenuButton  //播放速率

而初始化播放器的方法很简单,一种是在HTML里data-stup设置,比如autoplay:false即是不自动播放:

<video data-setup='{ "autoplay": false, "preload": "auto" }'...>

另一种是在js里初始化,可以控制是否显示该组件,true显示、false不显示。

var options = {
       controlBar:{                              //设置是否显示该组件
        'currentTimeDisplay':true,
     'timeDivider':true,
        'durationDisplay':true,
        'remainingTimeDisplay':false
       },
      autoplay: true
};

//初始化播放器

videojs(('#my-video', options, function() {
    
console.log('播放器初始化完成');    //回调函数
});

三、�事件与方法
videojs支持的事件和方法有很多,常用的有以下这些:

EVENTS

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

dispose
duration
ended //结束
error //错误
exitFullscreen //退出全屏
loop //循环
muted //静音
pause //暂停
paused //检测是否暂停的状态
poster //静态图片
remainingTime //余下时间

四、状态类名
播放器初始化后,我们可以看到这样的结构



可以看到在外层div有很多类名,在播放器切换不同状态的时候会改变这些类名,那么通过这些类名即可知道当前播放器处于什么状态,这会对我们开发有很大的帮助。

vjs-playing   //播放状态
vjs-paused   //暂停状态
vjs-waiting   //播放buffer为空,等待数据中 (对应播放事件中的waiting)
vjs-seeking   //seeking中 (对应播放事件中的seeking)
vjs-ended    //播放结束
vjs-has-started   //播放已经开始了,默认组件的posterImage就是通过这个class来隐藏自己
vjs-live    //当前播放的是直播流,controlBar组件中的liveDisplay子组件通过这个来显示自己
vjs-controls-disabled   //应该隐藏所有的控制组件时,例如有错误发生时
vjs-error     //有错误时
vjs-user-inactive    //用户当前处于非活动状态
vjs-user-active      //用户处于活动状态, 活动状态是指用户最近是否有移动鼠标或者点击按钮等操作。
                            //这种活动状态在没有新操作情况下,默认维持两秒,然后就进入非活动状态。
                            //在非活动状态下,一般会隐藏控制条的显示,这时候就用到这两个class了
                            //活动状态维持的时间可以配置,配置选项中默认 inactivityTimeout:2000

五、皮肤
要根据产品风格去设计播放器的样式,所以样式的重置是必不可少的。接下来说下在修改播放器样式时踩到的一些坑。
1.icon及颜色修改
通过覆盖样式去重置样式。比如修改颜色

.vjs-control-bar{
    color:red;
    font-size:20px;
}

IE下的兼容比较苦,若是实在难改,建议直接在videojs.css里全部重写修改

2.组件顺序
组件放置顺序的修改,在video.js中找到这段代码,将数组里的顺序修改下就可以了。

ControlBar.prototype.options_ = {
loadEvent: 'play',
children: ['playToggle', 'volumeMenuButton', 'currentTimeDisplay', 'timeDivider', 'durationDisplay', 'progressControl', 'liveDisplay', 'remainingTimeDisplay', 'customControlSpacer', 'playbackRateMenuButton', 'chaptersButton', 'subtitlesButton', 'captionsButton', 'fullscreenToggle']
};

3.hover提示
组件hover提示同理,找到源码修改就好了

k.prototype.controlText_ = "Play"     ------>     k.prototype.controlText_ = "播放"
k.prototype.controlText_ = "Fullscreen"   ------>   k.prototype.controlText_ = "全屏" 

4.音量bar由横的变竖的

var options = {
       volumeMenuButton: {
            inline: false,//设置音量bar为竖直
            vertical: true//设置音量bar为竖直
       }
};

//初始化播放器
videojs(('#my-video', options, function() {
console.log('播放器初始化完成');    //回调函数
});

六、插件
videojs提供了较为全面的基础功能,但还有些我们在产品中需要的功能是没有的。而现在有很多强大的插件来弥补这些不足。
比如切换清晰度功能我们用到了resolution-switcher-master插件。
使用方法如下

//引入插件的js文件
<script src="../../js/videojs-resolution-switcher-master/lib/videojs-resolution-switcher.js" charset="utf-8"></script>
<script type="text/javascript">
var options = {
    plugins: {  //插件都在这里引入 
          videoJsResolutionSwitcher: {    //引入插件
              default: 360,  //默认清晰度
              dynamicLabel: true
    }
}
        
};
videojs('#video2', options, function(){
     var player = this;
     window.player = player;
     player.updateSrc(
        [{src: '...',      //低清晰度视频源
        type: 'video/mp4',
        label: '高清',//显示的文字
        res: 360 //码率
         },
        {src: '...',   //高清晰度视频源
         type: 'video/mp4',
        label: '原画',//显示的文字
        res: 720 //码率
        }]
);
player.on('resolutionchange', function(){     //清晰度转换时调用的函数
      console.info('Source changed to %s', player.src())
      }) });
</script>

demo地址:https://kmoskwiak.github.io/videojs-resolution-switcher/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容