工具系列 | H5自定义视频播放器实现

时间:2022-07-22
本文章向大家介绍工具系列 | H5自定义视频播放器实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前言

目前,只是对自定义视频播放器的初步实现,之后会逐步完善!

一、H5视频、声频常用方法

1.canPlayType(); 检查浏览器是否能够播放指定的视频、声频。

使用canPlayType()方法检查浏览器是否能够播放指定的视频、声频。canPlayType()方法能够返回以下值:

  • “probably” : 浏览器最有可能支持视频的类型
  • “maybe” : 浏览器或许能够支持视频的类型
  • “ “ : 空字符,浏览器不支持视频的类型

说明

type

指定视频的种类以及解码器。常用值如下:video/mp4video/oggvideo/webm同时指定常用值及解码器:video/ogg;

JavaScript 语法

audio/video.canPlayType(kind,label,language);

2.load();加载视频、声频元素

使用load()方法重新加载视频元素。load()方法通常用于给video元素加载或设置新的媒体数据。

3.play();播放媒体数据

使用play()方法播放当前视频。该方法通常与pause()方法一起使用,实现播放和暂停功能。使用controls属性显示视频的操作界面(界面上通常包括播放、暂停、滑动条、音量等)。

4.pause();暂停媒体数据

使用pause()方法暂停当前视频。该方法通常与play()方法一起使用,实现播放和暂停功能。使用controls属性显示视频的操作界面(界面上通常包括播放、暂停、滑动条、音量等)。

二、H5视频、声频常用属性

1.autoplay属性 自动播放

使用autoplay属性,当视频播放准备工作一旦完成,视频马上播放。

说明

true

打开网页,视频自动播放,设置方法:autoplay=true,这时返回true

false

打开网页,视频不自动播放,设置方法:autoplay=false,这时返回false。默认值

JavaScript 语法

audio/video.autoplay=true/false;

2.buffered属性返回声频、视频的缓冲信息

使用buffered属性,返回TimeTanges事件,从TimeTanges事件中可以获得视频、声频的缓冲信息。

在TimeTanges事件中,针对完成缓冲的部分,有表示开始点的start属性和结束点的end属性,与currentTime相同, 容纳了以秒计算的实数值。

说明

TimeRanges事件

表示声频、视频的缓冲范围;TimeTanges事件的属性:length:获取声频、视频的缓冲长度;start(index):获取缓冲范围的开始点;end(index):获取缓冲范围的结束点注:矩阵的起始序号为0。

JavaScript 语法

audio/video.buffered;

3.controls属性 设置或返回视频、声频用户界面

使用controls属性设置或返回能够操作视频、声频播放或停止的用户标准界面。

用户标准界面的构成:

  • 播放
  • 暂停
  • 播放滑条
  • 音量
  • 满屏切换(视频)
  • 字幕切换(如果可用)
  • 字幕轨道(如果可用)

注:使用controls属性设置或返回视频是否带有基本用户操作界面。

说明

true

设定用户界面显示

false

设定用户界面不显示

JavaScript 语法

audio/video.controls=true/false;默认值:false

4.currentSrc属性 返回当前视频、声频的URL

使用currentSrc属性返回当前视频、声频的URL。如果没有视频或声频安装,将返回空字符。

该属性为只读属性。使用src属性设置视频文件。

返回的值

说明

返回的值

一串字符,即:当前视频、声频的URL。返回完整的URL,包括协议(如: http://), 如果没有设置媒体文件,将返回空字符。

false

设定用户界面不显示

JavaScript 语法

audio/video.currentSrc

5.currentTime属性 设置或返回视频、声频的当前播放位置

使用currentTime属性设置或返回视频、声频的当前播放位置(以秒计算)。如果设置了该属性,将跳至被指定的位置开始 播放。

说明

秒(seconds)

使用秒指定声频、视频的播放位置

返回的值

一个数值,当前的播放时间(以秒计算)

JavaScript 语法

audio/video.currentTime=“seconds”

6.duration属性 返回当前视频、声频的长度(以秒计算)

使用duration属性返回当前视频、声频的长度(以秒计算)。如果没有设置声频、视频文件,将返回NaN(Not-a-Number)。

注:该属性为只读属性。

说明

返回值

数值,指定的视频的长度,以秒计算。如果没有设置视频,将返回“NaN”(Not-a-Number)。如果只是视频流,没有预定的长度时,将返回 “Inf”(Infinity)。

JavaScript 语法

audio/video.duration

7.ended属性 返回视频、声频是否播放完毕

使用ended属性返回视频、声频是否播放完毕。如果播放位置在视频、声频的结束位置,代表声频、视频 播放结束。

注:该属性为只读属性。

说明

返回值

布尔值,返回true:播放结束返回false:播放没有结束

JavaScript 语法

audio/video.ended

8.loop属性 设置或返回视频、声频是否反复播放

使用loop属性,设置或返回视频、声频是否反复播放。

说明

true

指定视频、声频反复播放

false

指定视频、声频不反复播放

返回值

布尔值,如果视频、声频反复播放返回true;如果视频、声频不反复播放返回false;

JavaScript 语法

audio/video.loop=true/false

9.muted属性;设置或返回视频、声频是否静音

使用muted属性设置或返回视频、声频是否静音。muted属于逻辑属性。

说明

true

声频、视频指定静音

false

声频、视频不指定静音

返回值

布尔值;返回true时静音状态,返回false时不是静音状态。

JavaScript 语法

audio/video.muted=true/false;audio/video.muted(返回)

10.paused属性; 返回视频、声频否是暂停

使用paused属性返回视频、声频是否是暂停。

注:该属性为只读属性。

说明

返回值

布尔值,返回true:声频、视频暂停;返回false:声频、视频没有暂停。

JavaScript 语法

audio/video.paused

11.played属性 返回代表视频、声频播放部分的TimeTanges对象

使用played属性返回代表视频、声频播放部分的TimeTanges对象。播放部分是一个时间段, 用户可以获得多个即时播放时间段。

在TimeTanges事件中,针对播放完毕的部分,有表示开始点的start属性和结束点的end属性,与currentTime相同, 容纳了以秒计算的实数值。start与end是以矩阵的形式存在的。

注:该属性为只读属性。

说明

TimeTanges事件

代表媒体播放完了部分。TimeTanges事件的属性:length:获取声频、视频的播放长度;start(index):获取视频的开始点end(index):获取视频的结束点注:矩阵的起始序号为0

JavaScript 语法

audio/video.played

12.playbackRate属性 设置或返回声频、视频的播放速度

使用playbackRate属性设置或返回声频、视频的播放速度。

说明

播放速度

指定当前声频、视频的播放速度。值:1.0:标准速度;0.5:半速(慢速);2.0:双倍速度(快速);-1.0:后退(标准速度);-0.5:后退(半速);

返回值

数值,速度;默认值:1.0;

JavaScript 语法

audio/video.playbackRate

13.src属性 设置或返回当前声频、视频资源的URL

使用src属性返回当前视频、声频资源的URL。

说明

URL

指定的视频、声频资源的URL。

字符串,视频、声频的资源文件的保存地址(URL),返回绝对路径,包括协议(如: http://)

JavaScript 语法

audio/video.src=URLaudio/video.src(返回)

14.volume属性 设置或安装视频、声频的音量

说明

数量

指定当前声频、视频的音量。值必须取0.0-1.0之间的数值,例:1.0:声音最高(100%,默认值)0.5:中音(50%)0.0:静(相当于静音)

返回值

返回数值,代表当前音量

JavaScript 语法

audio/video.volume(返回)audio/video.volume=数值(设置)

二、H5视频、声频常用属性

1.加载声频、视频过程时,能够触发的事件如下:

  • 开始读入媒体数据时触发的事件(onloadstart)
  • 更改声频、视频的时长时(ondurationchange)
  • 浏览器已加载声频、视频的元数据时触发的事件(onloadedmetadata)
  • 浏览器加载声频、视频当前帧结束后(onloadeddata)
  • 浏览器正在下载媒体数据时(onprogress)
  • 浏览器可以播放媒体数据时(oncanplay)
  • 当浏览器可以在不因缓冲而停顿的情况下播放时(oncanplaythrough)

2.加载声频、视频时,容易受到的干扰,如下:

  • 因出错而中断(abort)
  • 空文件(emptied)
  • 出错(onerror)
  • 下载过程中,意外中断时(onstalled)
  • 浏览器不获取媒体数据时(onsuspend)

3.其它事件

(1)onended事件 目前的播放列表结束时触发的事件

使用场景如:当播放结束后自动显示或提示“谢谢观看!”、“谢谢收听!”等。

(2)onpause事件 为声频、视频暂停时触发的事件

(3)onplay事件 为声频、视频开始播放时触发的事件

(4)onseeked事件 为用户改变播放位置后触发的事件

即:用户操作滑动条到新的位置时触发的事件。

(5)onseeking事件 为用户开始改变或正在改变播放位置时触发的事件

即:用户正在操作滑动条时触发的事件。

(6)ontimeupdate事件 为当前播放位置发生改变后触发的事件

该timeupdate事件经常与Audio/Video事件的currentTime属性配合使用。curentTime属性返回 Audio/Video的当前播放位置。以秒计算。

(7)onvolumechange事件 为更改了声频、视频的音量时触发的事件

(8)onwaiting事件 为视频因为需要下载下一帧而停止时触发的事件

如果系统的看过以上H5声频、音频的相关知识,那么以下栗子就可以看得懂了。

/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 
* <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" id="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><script type="text/javascript" src="js/jquery-2.2.3.min.js"></script><script type="text/javascript" src="js/remauto.js"></script><title>自定义视频播放器</title><style>        .video-box{            position: relative;            width: 7.5rem;            height: 4.2rem;            margin: 0 auto;        }        .video-box video{            width: 7.5rem;            height: 4.2rem;        }        .controls-bar{            position: absolute;            left:0;            bottom: 0;            width: 100%;            height: 0.5rem;            background-color: rgba(0,0,0,0.2);            z-index: 999;        }        .progress {            position: relative;            float: left;            width: 3rem;            height: 0.06rem;            background-color: #8ed1bb;            -webkit-border-radius: 0.05rem;            -moz-border-radius: 0.05rem;            border-radius: 0.05rem;            margin-top: 0.22rem;            margin-left: 0.16rem;            cursor: pointer;        }        .bar {            display: inline-block;            position: absolute;            top: 0;            left: 0;            width: 0;            height: 100%;            background: #fff;            -webkit-border-radius: 0.05rem;            -moz-border-radius: 0.05rem;            border-radius: 0.05rem;        }        .control {            position: absolute;            left: -0.04rem;            top: -0.04rem;            width: 0.14rem;            height: 0.14rem;            background: #fff;            -webkit-border-radius: 50%;            -moz-border-radius: 50%;            border-radius: 50%;            z-index: 99;        }        .control:before{            content: '';            position: absolute;            right: -0.04rem;            top: -0.04rem;            width: 0.22rem;            height: 0.22rem;            background: rgba(255,255,255,0.3);            -webkit-border-radius: 50%;            -moz-border-radius: 50%;            border-radius: 50%;        }        .vioce{            float: left;            -webkit-border-radius: 50%;            -moz-border-radius: 50%;            border-radius: 50%;            font-size: 0.16rem;            margin-left: 0.3rem;            margin-top: 0.14rem;            color: #ffffff;        }        .video-switch{            position: relative;            float: left;            width: 0.4rem;            height: 0.4rem;            border: 1px solid #fff;            -webkit-border-radius: 0.1rem;            -moz-border-radius: 0.1rem;            border-radius: 0.1rem;            margin: 0.05rem 0.1rem;            cursor: pointer;        }        .switch-pause{            position: absolute;            right: 0;            top: 0;            bottom: 0;            margin: auto;            width:  0;            height: 0;            border: 0.1rem solid transparent;            border-left: 0.12rem solid #fff;        }        .switch-play{            position: absolute;            left: 0;            right: 0;            top: 0;            bottom: 0;            margin: auto;            width: 0.18rem;            height: 0.18rem;            border-left: 0.05rem solid #ffffff;            border-right: 0.05rem solid #ffffff;        }        #fullScreen{            float: left;            margin-top: 0.1rem;            margin-left: 0.3rem;        }        .fullscreen-icon{            display: block;            width: 0.3rem;            height: 0.3rem;            background: url("img/full.png") no-repeat;            -webkit-background-size: 0.3rem 0.3rem;            background-size: 0.3rem 0.3rem;        }        .video-mask{            display: none;        }        .controls-bar{            display: none;        }        .vioce input[type=range]{            width: 1.4rem;            height: 0.08rem;            -webkit-border-radius: 0.08rem;            -moz-border-radius: 0.08rem;            border-radius: 0.08rem;            vertical-align: middle;        }        .voice-icon{            display: inline-block;            width: 0.24rem;            height: 0.24rem;            -webkit-background-size: 0.24rem;            background-size: 0.24rem;            vertical-align: middle;        }        .voice-opened-icon{            background: url("img/voice-opened.png") no-repeat;        }        .voice-closed-icon{            background: url("img/voice-closed.png") no-repeat;        }    </style></head><body><div class="video-box"><div class="video-btn"><div class="video-mask"><i class="play-video-icon iconfont icon-bofang"></i></div></div><video autoplay><source src="perch.mp4"  type="video/mp4"><source src="movie.ogg"  type="video/ogg">您的浏览器不支持 HTML5 video 标签。</video><div class="controls-bar"><!--开关--><div class="video-switch"><div class="switch-btn switch-play"></div></div><!--进度条--><div class="progress"><span class="bar"></span><div class="control"></div></div><!--音量--><div class="vioce"><i class="voice-icon voice-opened-icon"></i><input type="range" min="0" max="100" value="50" id="vioceControle"></div><!--全屏--><div id="fullScreen"><i class="fullscreen-icon"></i></div></div></div><script type="text/javascript">    //得到video标签对象    var myVideo = $("video")[0];    var progress = $(".progress")[0];    var bar = $(".bar")[0];    var control = $(".control")[0];    var fullScreen = document.getElementById("fullScreen");    $(".video-btn").on("click",function () {        videoSwitch();        return false;    })    $(".video-switch").on("click",function () {        videoSwitch();    })//    开关控制    function videoSwitch() {        if (myVideo.paused){            myVideo.play();            $(".video-mask").hide();            $(".switch-btn").removeClass('switch-pause').addClass('switch-play');            $(".controls-bar").hide();        } else{            myVideo.pause();            $(".video-mask").show();            $(".switch-btn").removeClass('switch-play').addClass('switch-pause');            $(".controls-bar").show();        }    }    //    进度条    myVideo.addEventListener("timeupdate", function() {        var scales = myVideo.currentTime / myVideo.duration;        bar.style.width = progress.offsetWidth * scales/100 + "rem";        control.style.left = progress.offsetWidth * scales/100 - 0.04  + "rem";    }, false);    //    调节音量    var vioceControle = document.getElementById("vioceControle");    vioceControle.addEventListener("change",function () {        myVideo.volume = vioceControle.value/100;    })//    控制全屏    fullScreen.addEventListener('click',function () {        myVideo.webkitRequestFullScreen();    })//    鼠标进入视频,控制栏的显示与隐藏控制    $(".video-box").on("mouseover",function () {        $(".controls-bar").show();    });    $(".video-box").on("mouseout",function () {       console.log(myVideo.paused);       if(!myVideo.paused){           $(".controls-bar").hide();       }    })//    设置是否静音    $(".voice-icon").on("click",function () {        if(myVideo.muted) {            myVideo.muted = false;            $(this).removeClass("voice-closed-icon").addClass("voice-opened-icon");        } else {            myVideo.muted = true;            $(this).removeClass("voice-opened-icon").addClass("voice-closed-icon");        }        return false;    })</script></body></html>
*/

但是如何使用qq浏览器看该例子的话,会发现视频控制栏还是原来的样式,并不是我们自定义的样式。