videojs插件使用「建议收藏」

videojs插件使用「建议收藏」videojs插件使用介绍:兼容性强,开源免费,文档清晰,界面可定制等使用整理:使用主要针对于移动端视频播放,考虑的点:视频显示适配手机宽度;适配定义样式;在微信端,安卓、ios视频空间控件不同,定制等会自动被微信视频控件覆盖;播放过程中定制暂停/播放按钮事件等;播放结束后定制重播、下一个视频事件,读秒播放下一个视频html<videoid=”videoPlay…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

videojs插件使用

介绍:兼容性强,开源免费,文档清晰,界面可定制等

使用整理:使用主要针对于移动端视频播放,考虑的点:视频显示适配手机宽度;适配定义样式;在微信端,安卓、ios视频空间控件不同,定制等会自动被微信视频控件覆盖;播放过程中定制暂停/播放按钮事件等;播放结束后定制重播、下一个视频事件,读秒播放下一个视频

html

<video 
    id="videoPlayExecute"
    class="video-js vjs-default-skin video-label vjs-big-play-centered"
    controls
    preload="auto"
    webkit-playsinline="true"
    playsinline="true"
    x5-playsinline
    poster="./resource/images/test_pic.png"
>
    <source src="https://video.pearvideo.com/head/20190925/cont-1606116-14423410.mp4" type="video/mp4">
 </video>

Jetbrains全家桶1年46,售后保障稳定

自动播放,加一个 autoplay 就可以了,在微信移动端,是不允许视频自动播放

js

 var options = {
    autoplay: false,// 自动播放:true/false
    controls: true, // 是否显示底部控制栏:true/false
    aspectRatio: "16:9", // 将播放器置于流体模式下(如“16:9”或“4:3”)
    loop: false, // 是否循环播放:true/false
    muted: false, // 设置默认播放音频:true/false
    preload: "auto",
    fluid: true, // 是否自适应布局
    inactivityTimeout: 0, // 闲置超时
    nativeControlsForTouch: false, // 是否使用浏览器原生的控件
    language: 'zh-CN',
    controlBar: {
         children: [
             {name: 'playToggle'}, // 播放按钮
             {name: 'currentTimeDisplay'}, // 当前已播放时间
             {name: 'progressControl'}, // 播放进度条
             {name: 'durationDisplay'}, // 总时间
             {
                  name: 'volumePanel', // 音量控制
                  inline: false, // 不使用水平方式
             },
             {name: 'FullscreenToggle'} // 全屏
         ]
     }
}

var myPlayer = videojs('videoPlayExecute', options, function () {
    // 准备好播放
    // 在回调函数中,this代表当前播放器,
    var myPlayer = this;
    myPlayer.play();
    // 可以调用方法,也可以绑定事件。
    myPlayer.on('ended', function () {
         videoCoverLayer.fadeIn(600);
         myVideo.hide();
         // 播放结束
         if (cancelAutoplayHD.val() === '1') {
              cancelAutoplayBtn.hide();
         } else {
              cancelAutoplayBtn.show();
         }
         playVideoBtn.hide();
         replayVideoBtn.show();
         nextVideoBtn.show();
         countDownNum.html(5);
         var num = 5;
         function countDown() {
             if (num > 0) {
                 num--;
                 countDownNum.html(num);
             } else {
                 if (cancelAutoplayHD.val() !== '1') {
                     replayVideoBtn.hide();
                     nextVideoBtn.hide();
                     cancelAutoplayBtn.hide();
                     loadNextVideo(relatedFirstVideoUrl)
                 } else {
                     countDownNum.html(5);
                 }
                 clearInterval(timer);
             }
         }
  
         var timer = setInterval(function () {
             countDown();
         }, 1000);
     });

    // 监听视频播放开始
    myPlayer.on("play", function () {
        // 监听视频播放开始
      playVideoBtn.hide();
      pauseVideoBtn.hide();
    });

    // 监听视频播放暂停
    myPlayer.on("pause", function () {
       // 监听视频播放暂停
       playVideoBtn.hide();
       pauseVideoBtn.hide();
    });
});

css:修改按钮样式

/* video.js样式修改 */
.video-js { /* 给.video-js设置字体大小以统一各浏览器样式表现,因为video.js采用的是em单位 */
    font-size: 14px;
}

.video-js button {
    outline: none;
}

.video-js.vjs-fluid,
.video-js.vjs-16-9,
.video-js.vjs-4-3 { /* 视频占满容器高度 */
    height: 100%;
    background-color: #161616;
}

.vjs-poster {
    background-color: #161616;
}

.video-js .vjs-big-play-button { /* 中间大的播放按钮 */
    font-size: 2.7em;
    line-height: 1.5em;
    height: 1.5em;
    width: 1.5em;
    -webkit-border-radius: 2.2em;
    -moz-border-radius: 2.2em;
    border-radius: 2.2em;
    background-color: rgba(0, 0, 0, .3);
    border-width: 0;
    margin-top: -1em;
    margin-left: -0.9em;
}

.video-js.vjs-paused .vjs-big-play-button { /* 视频暂停时显示播放按钮 */
    display: block;
}

.video-js.vjs-error .vjs-big-play-button { /* 视频加载出错时隐藏播放按钮 */
    display: none;
}

.vjs-loading-spinner { /* 加载圆圈 */
    font-size: 2em;
    width: 2em;
    height: 2em;
    border-radius: 1em;
    margin-top: -1em;
    margin-left: -1.5em;
}

.video-js .vjs-control-bar { /* 控制条默认显示 */
    display: flex;
}

.video-js .vjs-time-control {
    display: block;
}

.video-js .vjs-remaining-time {
    display: none;
}

.vjs-button > .vjs-icon-placeholder:before { /* 控制条所有图标,图标字体大小最好使用px单位,如果使用em,各浏览器表现可能会不大一样 */
    font-size: 22px;
    line-height: 1.9;
}

.video-js .vjs-playback-rate .vjs-playback-rate-value {
    line-height: 2.4;
    font-size: 18px;
}

/* 进度条背景色 */
.video-js .vjs-play-progress {
    color: #dc0b21;
    /*background-color: #ffb845;*/
}

/*dc0b21*/
.video-js .vjs-progress-control .vjs-mouse-display {
    /*background-color: #ffb845;*/
}

.vjs-mouse-display .vjs-time-tooltip {
    padding-bottom: 6px;
    background-color: #dc0b21;
}

.video-js .vjs-play-progress .vjs-time-tooltip {
    display: none !important;
}

/* 控制台背景色 */
.video-js .vjs-control-bar {
    background-color: rgba(43, 51, 63, .5);
}

优化是针对option,有些节点是不需要的,但是默认是创建了,所以会影响效率

children : {
    bigPlayButton : false,
    textTrackDisplay : false,
    posterImage: false,
    errorDisplay : false,
    controlBar : {
        captionsButton : false,
        chaptersButton: false,
        subtitlesButton:false,
        liveDisplay:false,
        playbackRateMenuButton:false
    }
}

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

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

height

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

Component Options

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

其他组件:声音,播放按钮,字幕,时间,进度条等等,它们在html中的结构类似于这样子:

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

METHODS(参数)

更多:https://github.com/videojs/video.js/blob/stable/docs/api/vjs.Player.md

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

EVENTS(事件)

hide() 隐藏,show() 显示,play()播放,pause(), el()获取video元素 ,暂停 几本上就差不多了

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

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(){
    
});

给插件按钮加样式,显示到合适的位置

.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;
}

总结:对于单页应用,videojs在隐藏时,内部的状态就存在丢失的情况,会导致一系列的问题。解决的办法就是播一次就创建一次。关闭就清理。经测试,这种模式就再也不会有错误了

video.js API 详解

$(document).ready(function () {

        var player = $("video[data-video='example_video_1']").videoJs({
            /**
             * 自动播放:true/false
             * 参数类型:Boolean
             **/
            autoplay: false,

            /**
             * 是否显示底部控制栏:true/false
             * 参数类型:Boolean
             **/
            controls: true,

            /**
             * 视频播放器显示的宽度
             * 参数类型:String|Number
             * 例如:200 or "200px"
             **/
            width: 300,

            /**
             * 视频播放器显示的高度
             * 参数类型:String|Number
             * 例如:200 or "200px"
             **/
            height: 300,

            /**
             * 将播放器置于流体模式下,计算播放器动态大小时使用该值。
             * 该值应该是比用冒号隔开的两个数字(如“16:9”或“4:3”)。
             * 参数类型:String
             **/
            //aspectRatio:"1:1",

            /**
             * 是否循环播放:true/false
             * 参数类型:Boolean
             **/
            loop: false,

            /**
             * 设置默认播放音频:true/false
             * 参数类型:Boolean
             **/
            muted: false,
            /**
             * 建议浏览器是否在加载<video>元素时开始下载视频数据。
             * 预加载:preload
             * 参数类型:String
             * 参数值列表:
             * auto:立即加载视频(如果浏览器支持它)。一些移动设备将不会预加载视频,以保护用户的带宽/数据使用率。这就是为什么这个值被称为“自动”,而不是更确凿的东西
             * metadata:只加载视频的元数据,其中包括视频的持续时间和尺寸等信息。有时,元数据会通过下载几帧视频来加载。
             * none:
             */
            preload: "metadata",

            /**
             * 视频开始播放前显示的图像的URL。这通常是一个帧的视频或自定义标题屏幕。一旦用户点击“播放”图像就会消失
             * 参数类型:String
             **/
            // poster:"",

            /**
             * 要嵌入的视频资源url,The source URL to a video source to embed.。
             * 参数类型:String
             **/
            // src:"",

            /**
             * 此选项从组件基类继承。
             * 参数类型:Array|Object
             **/
            //  children:[],

            /**
             * 是否自适应布局
             * 播放器将会有流体体积。换句话说,它将缩放以适应容器。
             * 如果<video>标签有“vjs-fluid”样式时,这个选项会自动设置为true。
             * 参数类型:Boolean
             **/
            fluid: false,

            /**
             * 闲置超时
             * 值为0表示没有
             * 参数类型:Number
             **/
            inactivityTimeout: 0,

            /**
             * 语言
             * 参数类型:String
             * 支持的语言在lang目录下
             */
            language: 'zh-CN',

            /**
             * 语言列表
             * 参数类型:Object
             * 自定义播放器中可用的语言
             * 注:一般情况下,这个选项是不需要的,最好是通过自定义语言videojs。addlanguage().
             */
            languages: "",

            /**
             * 是否使用浏览器原生的控件
             * 参数类型:Boolean
             */
            nativeControlsForTouch: false,

            /**
             * 是否允许重写默认的消息显示出来时,video.js无法播放媒体源
             * 参数类型:Boolean
             */
            notSupportedMessage: false,

            /**
             * 插件
             * 参数类型:Object
             */
            plugins: {},

            /**
             * 资源排序
             * 参数类型:Boolean
             * 在video.js 6,这个选项将默认为true,
             * videojs Flash将被要求使用Flash技术
             */
    //        sourceOrder:false,

            /**
             * 资源列表
             * 参数类型:Array
             */
//            sources: [{
//                src: '//path/to/video.flv',
//                type: 'video/x-flv'
//            }, {
//                src: '//path/to/video.mp4',
//                type: 'video/mp4'
//            }, {
//                src: '//path/to/video.webm',
//                type: 'video/webm'
//            }],

            /**
             * 使用播放器的顺序
             * 参数类型:Array
             * 下面的示例说明优先使用html5播放器,如果不支持将使用flash
             */
            //techOrder: ['html5', 'flash'],

            /**
             * 允许重写默认的URL vtt.js,可以异步加载到polyfill支持WebVTT。
             * 此选项将在“novtt”建立video.js(即video。novtt js)。否则,vtt.js捆绑video.js。
             * 参数类型:String
             */
           // "vtt.js":""
        }, function () {

        });
        console.log(player);
        console.log(player.bigPlayButton.controlTextEl_)
    });

 

感谢作者:

https://www.cnblogs.com/Renyi-Fan/p/11626583.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203546.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux常用的20个命令面试_linux常用命令详解pdf

    linux常用的20个命令面试_linux常用命令详解pdf什么是linux多用户,多任务,支持多线程和多CPU的操作系统linux的应用领域:免费,稳定,高效的,一般运行在大型服务器上用xshell连接虚拟机的步骤:1.setup设置虚拟机IP为10.10.10.10重启网卡:servicenetworerestart2.在Windows系统打开网络和共享中心,更改适配器设置,把vmnet1的ipv4的IP改成10.10.10.13.打开xshell,输入ssh10.10.10.10/根目录:一般根目录下只存放目录,有且只有一个根目

    2022年9月23日
    4
  • 关于html5的PostMessage的用法总结

    关于html5的PostMessage的用法总结  大家都知道,网页直接传递数据可以使用ajax请求来完成,今天我总结下我学习的postMessage是如何完成跨页面请求数据的呢?首先,postMessage是html5新增的一个解决跨域的一个方法。那他是如何使用的呢?这里我把一个案例分享出来把。看下面的代码:test.html&lt;!DOCTYPEhtml&gt;&lt;html&gt;&lt;head&gt; &lt;titl…

    2022年7月13日
    16
  • 调用第三方接口大致流程

    调用第三方接口大致流程下面以风控为例,业务是调用第三方接口获取支付宝报告天机支付宝获取流程:1本质:中转站:前台把参数传给我,我接受参数后传给天机,天机在传给支付宝,最后获取数据,在这个过程中   我们和天机都充当的是中转站的角色。2流程:a前台传客户的基本信息参数    b后台接受参数,传给天机,天机返回淘宝的认证地址链接,后台把链接返回给前台;    c前台打开链接,进入认证页面,进行认…

    2022年6月1日
    51
  • 如何制作一个简单的HTML登录页面(附代码)[通俗易懂]

    如何制作一个简单的HTML登录页面(附代码)[通俗易懂]几乎每个网站都会有登录页面,那你知道如何写HTML登录页面吗?这篇文章就和大家分享一个HTML简单登录界面的代码,有一定的参考价值,感兴趣的朋友可以看看。实例:制作一个HTML登录页面,包含邮箱,登录密码,立即注册,忘记密码等,代码如下:HTML部分:<divclass=”dowebok”><divclass=”logo”></div><divclass=”form-item”><inputid=”username”t

    2022年6月13日
    27
  • nginx 日志管理「建议收藏」

    nginx 日志管理「建议收藏」打开nginx.conf配置文件我们观察nginx的server段,可以看到如下类似信息#access_loglogs/host.access.logmain;这说明该server,它的访问日志的文件是logs/host.access.log,使用的格式”main”格式.除了main格式,你可以自定义其他格式.main格式是什么?log_form…

    2022年5月27日
    34
  • TD-SCDMA特点_TDD-LTE

    TD-SCDMA特点_TDD-LTETD-SCDMA的提出比其他标准较晚,这给其产品成熟性带来一定的挑战,但在另一方面,TD-SCDMA吸纳了九十年代以来移动通信领域最先进的技术,在一定程度上代表了技术的发展方向,具有前瞻性和强大的后发优势。与其他3G标准相比,TD-SCDMA系统及其技术有着如下突出优势:  频谱效率高  TD-SCDMA系统综合采用了联合检测、智能天线和上行同步等先进技术,系统内的…

    2022年10月3日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号