【JS&JQuery】videojs插件使用

本文链接:【JS&JQuery】videojs插件使用
相关文档:【Vue】插件:八、结合 vue-video-player、videojs-flash、videojs-contrib-hls使用videojs播放视频
相关文档:【Nuxt】四、VueX使用教程

1. 下载

github最新代码地址
下载代码$ npm install --save-dev video.js

1.1. 下载链接

videojs-5.6.0~5.8.6版本下载

videojs-5.17.0~5.18.4版本下载

1.2. 下载方法

选择下载版本点击
下载压缩包

2. jsp使用案列

2.1. 头部

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
    String ctx = request.getContextPath();
    request.setAttribute("ctx", ctx);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head lang="zh-cn">
    <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
    <meta http-equiv="x-ua-compatible" content="IE=edge"/>
    <title>视频播放页面</title>
    <jsp:include page="../base/header.jsp"/>
    <link rel="stylesheet"
          href="${ctx }/resources/common/css/organization/conferenceTopic_check.css"/>
    <link rel="stylesheet" href="${ctx }/resources/common/css/organization/videoPage.css"/>
    <%--播放器videojs--%>
    <link rel="stylesheet" type="text/css" href="${ctx }/resources/videojs7.7.5/video-js.css" />
</head>

2.2. body末尾,调用js之前

<%--播放器videojs-7.7.5--%>
<script src="${ctx }/resources/videojs7.7.5/video.js" type="text/javascript"></script>
<script src="${ctx }/resources/videojs7.7.5/lang/zh-CN.js" type="text/javascript"></script>

2.3. html中

注意!!! htmlvideo标签``data-setup="{}"`设置为空时,在IE下 初始化videojs设置options会不生效

<div class="videoPlayer">
    <%--左侧播放列表--%>
    <div class="playerList">
        <h3>播放列表</h3>
        <ul id="playerList">
            <%--<li onclick="fnPlayVideo('vodId')">视频1</li>--%>
        </ul>
    </div>
    <%--右侧播放器--%>
    <div class="player">
        <video
                id="my-video"
                class="video-js vjs-big-play-centered"
                controls
                preload="auto"
                width="950"
                height="650"
                data-setup="{}"
        >
            <%--<source src="${ctx}/resources/common/2.mp4" type="video/mp4"/>--%>
            <p class="vjs-no-js">
                To view this video please enable JavaScript, and consider upgrading to a
                web browser that
                <a href="https://videojs.com/html5-video-support/" target="_blank"
                >supports HTML5 video</a
                >
            </p>
        </video>
    </div>
</div>

2.4. js 中

注意!!! htmlvideo标签data-setup="{}"设置为空时,在IE下 初始化videojs设置options会不生效

<script type="text/javascript">
    var options = {
        controls: true,//是否显示控制条
        // preload: 'auto', // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
        playbackRates: [0.7, 1.0, 1.5, 2.0], // 播放速度
        loop: false, // 导致视频一结束就重新开始。
        language: 'zh-CN',
        notSupportedMessage: '此视频暂无法播放!', // 无法播放时显示的信息
        controlBar: {
            volumePanel: {
                inline: false
            },
            currentTimeDisplay: true, //当前播放位置
            timeDivider: false, // 时间分割线
            durationDisplay: false, // 总时间
            progressControl: true, // 进度条
            remainingTimeDisplay: false, // 剩余时间
            fullscreenToggle: true // 全屏按钮
        }
    };
    var listId = getParamer('listId ');

    var player = videojs('myvideo', options, function onPlayerReady() {
        videojs.log('播放器已经准备好了!');
        this.play();
        this.on('ended', function () {
            videojs.log('播放结束了!');
        });
    });

    $(function () {
        /**
         * @url {string} '/videoconferencing/xyHistoryVideo' 请求播放列表
         * @listId {string} 请求参数[列表编号]
         * @videoID {string} 返回参数[视频ID]
         * @videoName{string} 返回参数[视频默认名称]
         */
        $.ajax({
            url: '${ctx}/接口地址',
            data: {
                listId: listId,
            },
            type: "post",
            dataType: "json",
            async: true,
            success: function (data) {
                // if (1 === 1) {//示例
                if (data.code === 1) {
                    var data = data.data;
                    var list = $('#playerList');
                    list.empty();
                    // for (var i = 0; i < 2; i++) {//示例
                    for (var i = 0; i < data.length; i++) {
                        list.append(" <li onclick='fnPlayVideo(this,\"" + data[i].videoID + "\")'>" + data[i].videoName + "</li> ")
                        // list.append(" <li onclick='fnPlayVideo(this,\""+'1'+"\")'>" + '测试视频'+i + "</li> ")//示例
                    }
                } else {
                    parent.showConfirmDialog('消息提示', data.msg, '0001');
                }
            },
            error: function (data) {
                console.log(data);
            }
        });
    });

    function fnPlayVideo(that, vodId) {
        myvideo.reset();//播放器-重置画面
        $(that).addClass('active').siblings('li').removeClass('active');

        /**
         * @url {string} '/videoconferencing/xyVideoUrl'
         * @videoID {string} 请求参数[视频编号]
         * @shared {boolean} 返回参数[是否解密完成] false:未解密完成
         */
        $.ajax({
            url: '${ctx}/接口地址',
            data: {
                videoID: videoID,
            },
            type: "post",
            dataType: "json",
            async: false,
            success: function (data) {
                if (data.code === 1) {
                    var data = data.data;
                    if (!data.shared) {
                        parent.showConfirmDialog('消息提示', '视频未解密完成,请稍后再试', '0001');
                        return
                    }
                    myvideo.src(data.playUrl);//播放器-设置播放资源
                    myvideo.load(data.playUrl);//播放器-加载播放资源
                    myvideo.play();//播放器-播放
                    //myvideo.dispose();//播放器-销魂
                } else {
                    parent.showConfirmDialog('消息提示', data.msg, '0001');
                }
            },
            error: function (data) {
                console.log(data);
            }
        });

    }

</script>

2.5. css

#my-video {
  width: 100%;
  height: 100%;
  .vjs-control-bar {
    font-size: 18px;
  }
  &.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {
    //opacity: 1;//鼠标移除后显示控制条
  }
  .vjs-modal-dialog .vjs-modal-dialog-content {
    padding: 50px 20px;
  }
  button {
    outline: none;
  }
}

.videoPlayer{
    padding: 20px;
}
.playerList{
    width: 250px;
    float: left;
    overflow: hidden;
}

.playerList h3{
    height: 30px;
    font-size: 20px;
    color: #f00;
    margin-bottom: 10px;
}

.playerList ul{
    height: 610px;
    border: 1px solid #ccc;
    overflow-y: scroll;
}

.playerList ul li{
    padding: 0 10px;
    line-height: 35px;
    cursor: pointer;
    overflow: hidden;
    text-overflow:ellipsis;
    white-space: nowrap;
    font-size: 16px;
}

.player{
    float: right;
}

.active{
    color: #f00;
}

3. 使用文档

3.1. 初始化

注意!!! htmlvideo标签data-setup="{}"设置为空时,在IE下 初始化videojs设置options会不生效

//播放器-初始化
var myvideo= videojs('myvideo', options, function onPlayerReady() {
  videojs.log('播放器已经准备好了!');
  this.play();
  this.on('ended', function () {
    videojs.log('播放结束了!');
  });
});

3.2. 方法

方法名称 说明
dispose 清理-销毁 从播放器中删除所有事件侦听器及其DOM元素myvideo.dispose ()
pause 暂停 myvideo.pause()
play 播放 myvideo.play ()
load 加载播放资源myvideo.load ( playUrl )
reset 重置画面myvideo.reset ( )
playUrl 设置播放资源myvideo.src( playUrl )
on 监听事件 myvideo.on('ended', function () { });
trigger 触发事件 this.trigger('dispose')
currentTime 获取播放进度myvideo.currentTime(); 设置播放进度myvideo.currentTime(60);
duration 视频持续时间,需先加载完成,且在flash情况下无效 var duration = myvideo.duration();
buffered 缓冲(返回下载了多少): myvideo.buffered();
bufferedPercent 百分比的缓冲: myvideo.bufferedPercent();
volume 声音大小(0-1之间): 获取声音大小myvideo.volume();设置声音大小:myvideo.volume(0.5);
width 获取视频宽度:myvideo.width();设置视频宽度:myvideo.width(640);
height 获取视频高度: var howTallIsIt = myvideo.height();设置视频高度:myvideo.height(480);
size 设置大小:myvideo.size(640,480);
enterFullScreen 全屏: myvideo.enterFullScreen(); HTML5 video 进入全屏和退出全屏

\color{#f00}{!!!}\ dispose销毁后如需再次使用,要初始化重新创建标签

var myVideoDiv = document.getElementById("myVideoDiv");
myVideoDiv.innerHTML = 
"<video 
  id='myvideo' 
  class='video-js vjs-default-skin  vjs-big-play-centered' 
  controls 
  preload='auto' 
  style='width: 100%;height: 100%' 
  controlBar='true'>
  <source src="+ this.firstSrc +" style='width: 100%;height: 100%' type='application/x-mpegURL'>
</video>"

3.3. 事件

事件名称 说明
play 播放 myvideo.on('play', function () { }); this.trigger('play')
pause 暂停
ended 结束
error 错误
loadeddata 数据加载完成
volume 改变播放器音量
currentTime 提供当前正在播放的当前时间(以秒为单位)。
duration 提供正在播放的视频的总持续时间
bufferedPercent 提供缓冲视频的当前百分比。
durationchange 持续时间改变
firstplay 第一次播放
loadedalldata 全部数据加载完成
loadstart 开始加载
progress 进度
seeked 寻找
seeking 寻找中
timeupdate 时间更新
volumechange 音量改变
waiting 等待中
resize inherited 重置大小
var myFunc = function(){ // Do something when the event is fired }; 自定义事件

删除事件

myvideo.removeEvent(“eventName”, myFunc);

监听 error 事件

myvideo.on('error',function () {
  var error=this.error_;
  if(error.code===4){ //1.用户终止 2.网络错误 3.解码错误 4.URL无效
  }
});

3.4. 视频加载方式

  • html方式
<video id="myvideo">
 <source src="//path/to/video.mp4" type="video/mp4">
 <source src="//path/to/video.webm" type="video/webm">
</video>
  • js 方式
videojs('myvideo', {
  sources: [{
    src: '//path/to/video.mp4',
    type: 'video/mp4'
  }, {
    src: '//path/to/video.webm',
    type: 'video/webm'
  }]
});

myvideo.src({type: "video/mp4", src: "xxxxxxx"});

3.5. options 选项

标准元素选项

这些选项中的每一个也可用作标准元素属性 ; 因此,可以使用设置指南中列出的所有三种方式定义它们。通常,未列出默认值,因为这是留给浏览器供应商的。

名称 说明
autoplay true/false 播放器准备好之后,是否自动播放 【默认false】
controls true/false 是否拥有控制条 【默认true】,如果设为false ,那么只能通过api进行控制了。
也就是说界面上不会出现任何控制按钮
height 视频容器的高度,字符串或数字 单位像素 比如: height:300 or height:‘300px‘
width 视频容器的宽度, 字符串或数字 单位像素
loop true/false 视频播放结束后,是否循环播放 true:视频一结束就重新开始。
muted true/false 是否静音 默认情况下会静音任何音频
poster 播放前显示的视频画面,播放开始之后自动移除。通常传入一个URL
preload 预加载 建议浏览器是否应在加载元素后立即开始下载视频数据
auto 自动 | metadata 元数据信息 ,
比如视频长度,尺寸等 | none不预加载任何数据,直到用户开始播放才开始下载
src 类型: string 要嵌入的视频源的源URL。

Video.js特定的选项

undefined除非另有说明,否则默认情况下每个选项

名称 说明
aspectRatio 类型: string 将播放器置于流体模式,并在计算播放器的动态大小时使用该值。
该值应表示比率 - 由冒号(例如"16:9"或"4:3")分隔的两个数字。
autoSetup 类型: boolean 阻止播放器为具有data-setup属性的媒体元素运行autoSetup 。
注意:必须在与videojs.options.autoSetup = falsevideojs源加载生效的同一时刻全局设置。
children Array | Object 可选子组件 从基础的Component组件继承而来的子组件,数组中的顺序将影响组件的创建顺序哦。
fluid 类型: boolean 何时true,Video.js播放器将具有流畅的大小。换句话说,它将扩展以适应其容器。
此外,如果元素具有"vjs-fluid",则此选项自动设置为true。
inactivityTimeout 类型: number Video.js表示用户通过"vjs-user-active"和"vjs-user-inactive"类以及"useractive"事件与玩家进行交互。
在inactivityTimeout决定了不活动的许多毫秒声明用户闲置之前是必需的。
值为0表示没有inactivityTimeout,用户永远不会被视为非活动状态。
language 键入:string,默认值:浏览器默认值或’en’与播放器中的一种可用语言匹配的语言代码。
这为播放器设置了初始语言,但始终可以更改。
languages 类型: Object 自定义播放器中可用的语言。此对象的键将是语言代码,值将是具有英语键和翻译值的对象。
注意:通常,不需要此选项,最好将自定义语言传递给videojs.addLanguage()所有玩家!
nativeControlsForTouch 类型: boolean 明确设置关联技术选项的默认值。
notSupportedMessage 类型: string 允许覆盖Video.js无法播放媒体源时显示的默认消息。
playbackRates 类型: Array 严格大于0的数字数组,其中1表示常速(100%),0.5表示半速(50%),2表示双速(200%)等。
如果指定,Video.js显示控件(类vjs-playback-rate)允许用户从选择数组中选择播放速度。
选项以从下到上的指定顺序显示。videojs('my-player', { playbackRates: [0.5, 1, 1.5, 2] });
plugins 类型: Object 这支持在初始化播放器时使用自定义选项自动初始化插件 - 而不是要求您手动初始化它们。
videojs('my-player', { plugins: { foo: {bar: true}, boo: {baz: false} } }); <br>以上大致相当于:var player = videojs('my-player'); player.foo({bar: true}); player.boo({baz: false});
虽然,由于plugins选项是对象,因此无法保证初始化顺序!
sources 类型: Array 一组对象,它们反映了本机元素具有一系列子元素的能力。这应该是带有src和type属性的对象数组
techCanOverridePoster 类型: boolean 使技术人员有可能覆盖玩家的海报并融入玩家的海报生命周期。
当使用多个技术时,这可能很有用,每个技术都必须在播放新源时设置自己的海报。
techOrder 输入:Array,默认值:[‘html5’] 定义Video.js技术首选的顺序。默认情况下,这意味着Html5首选技术。
其他注册的技术将在此技术之后按其注册顺序添加。
vtt.js 类型: string 允许覆盖vtt.js的默认URL,该URL可以异步加载到polyfill支持WebVTT。
此选项将用于Video.js(即video.novtt.js)的“novtt”版本中。否则,vtt.js与Video.js捆绑在一起。

组件选项

Video.js播放器是一个组件。与所有组件一样,您可以定义它包含的子项,它们出现的顺序以及传递给它们的选项。

这是一个快速参考; 因此,有关Video.js中组件的更多详细信息,请查看组件指南。

children

类型: Array|Object | 如果Array- 这是默认值 - 这用于确定哪些子节点(按组件名称)以及在播放器(或其他组件)上创建它们的顺序:

// The following code creates a player with ONLY bigPlayButton and
// controlBar child components.
videojs('my-player', {
  children: [
    'bigPlayButton',
    'controlBar'
  ]
});

该children选项还可以作为传递Object。在这种情况下,它用于提供options任何/所有孩子,包括禁用它们false:

// This player's ONLY child will be the controlBar. Clearly, this is not the
// ideal method for disabling a grandchild!
videojs('my-player', {
  children: {
    controlBar: {
      fullscreenToggle: false
    }
  }
});
${componentName}

类型: Object | 可以通过组件名称的低驼峰案例变体(例如controlBarfor ControlBar)为组件提供自定义选项。这些可以嵌套在孙子关系的表示中。例如,要禁用全屏控件:

videojs('my-player', {
  controlBar: {
    fullscreenToggle: false
  }
});

技术选择

${techName}

类型: Object

Video.js回放技术(即“技术”)可以作为传递给该videojs功能的选项的一部分给予自定义选项。它们应该在技​​术名称的小写变体下传递(例如"flash"或"html5")。

flash

swf,指定Video.js SWF文件在Flash技术位置的位置:

videojs('my-player', {
  flash: {
    swf: '//path/to/videojs.swf'
  }
});

但是,更改全局默认值通常更合适:

videojs.options.flash.swf = '//path/to/videojs.swf’
html5
nativeControlsForTouch

类型: boolean | 只有技术支持Html5,此选项可以设置true为强制触摸设备的本机控件。

nativeAudioTracks

类型: boolean | 可以设置为false禁用本机音轨支持。最常用于videojs-contrib-hls。

nativeTextTracks

类型: boolean | 可以设置为false强制模拟文本轨道而不是本机支持。该nativeCaptions选项也存在,但只是一个别名nativeTextTracks。

nativeVideoTracks

类型: boolean | 可以设置为false禁用本机视频轨道支持。最常用于videojs-contrib-hls。

3.6.视频资源切换

function playThisVideo(index){
  myvideo.reset(); 
  myvideo.src([
    {
      type: 'application/x-mpegURL',
      src: videoList[index].url
    },
  ]);
  myvideo.load();
  myvideo.play();
}

常见问题

IE中设置options参数不起作用

注意!!! htmlvideo标签data-setup="{}"设置为空时,在IE下 初始化videojs设置options会不生效,移除此项即可

IE11中全屏按钮置灰无法点击

如果当前页面是iframe,则需要设置iframeallowfullscreen属性为true

禁止在iPhone safari中自动全屏

很多人给出的方法是,在<video>标签中加入playsinline参数,如 <video playsinline ></video>,\color{#f00}{注意}\,在iOS10之前用的是webkit-playsinline。

播放按钮居中

videojs默认的播放按钮在左上角,是作者认为会遮挡内容考虑的。
不过这是可以通过参数修改的,在<video>标签中加入vjs-big-play-centered

暂停时显示播放按钮

videojs在未播放时,会显示一个大的播放按钮

.vjs-paused .vjs-big-play-button,
.vjs-paused.vjs-has-started .vjs-big-play-button {
    display: block;
}

点击屏幕切换播放/暂停

这个是视频播放的时候用得较多的功能,解决方法如下。

.video-js.vjs-playing .vjs-tech {
    pointer-events: auto;
}

鼠标移除后显示控制条

.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {
    //opacity: 1;//鼠标移除后显示控制条
  }

去除按钮点击后出现蓝色边框

.video-js button{
    outline: none;
  }

设置控制条样式

.vjs-control-bar {
   font-size: 18px;
 }

参考文档网址:
官方使用文档
官方教程
videojs 销毁重新初始化问题及其他使用推荐
videojs中文文档详解推荐
videojs使用技巧推荐
videojs插件使用推荐
videojs兼容IE8未验证成功
js插件---videojs的使用推荐
jQuery插件库>视频播放插件Video.js
视频播放插件 Video.js 使用和个版本下载推荐
Video.js事件
videojs+hls+rtmp流媒体播放

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