video对象

兼容情况:

safari浏览器不支持webm格式

Chrome浏览器支持webm格式

ie8以及以下不支持video标签 , ie9支持video标签 ,但是支持mp4格式的

Firefox(火狐浏览器)支持ogv格式的视频


兼容性写法

    <video controls>
<source src="data/demo.ovg">
<source src="data/demo.mp4">
<source src="data/demo.webm">
您的浏览器不支持,请升级您的浏览器
</video>

video 标签 width height autoplay muted
poster带有预览图(海报图片)的视频播放器

    <video src='data/demo.mp4' muted controls autoplay height='400' width="200" poster='data/poster.jpg'></video>

选中video标签

        var VideoNode = document.getElementById('myVideo');

src控制视频的来源

        VideoNode.src = 'data/demo.ogv';

手动设置控件 controls

        VideoNode.controls = true;

设置视频音量

        VideoNode.volume = 0.5;

currentTime当前播放时间
快进效果

        gogogo.onclick = function(){
VideoNode.currentTime = VideoNode.currentTime + 3;
};

暂停 pause()

        stopNode.onclick = function(){
VideoNode.pause();
};

播放play()

        playNode.onclick = function(){
VideoNode.play();
};

load 刷新播放器的事件

        reloadNode.onclick = function(){
VideoNode.src = 'data/demo.mp4';
VideoNode.load();
};

canplay 视频已经加载好 可以开始播放了

        VideoNode.addEventListener('canplay',function(){
console.log('视频已经加载好 可以开始播放了');
});

requestFullscreen 让video标签变成全屏
VideoNode.webkitRequestFullscreen();
VideoNode.mozRequestFullScreen();

        fullScreenNode.onclick = function(){
if(VideoNode.webkitRequestFullscreen){
VideoNode.webkitRequestFullscreen();
}
else if(VideoNode.mozRequestFullScreen){
VideoNode.mozRequestFullScreen();
}
};

volumechange 当音量更改时

        VideoNode.onvolumechange = function(){
console.log('volumechange');
};

声音随机更改

        volumeNode.onclick = function(){
VideoNode.volume = Math.random();
};

seeking 当用户开始拖动进度条时 就会触发的事件

        var seekingNum = 0;
VideoNode.onseeking = function(){
console.log('seeking...');
seekingNum++;
seeking.innerHTML = seekingNum;
};

seeked 当用户对视频的进度条并且已经完成操作时会触发的事件

        var seekedNum = 0;
VideoNode.onseeked = function(){
console.log('seeked...');
seekedNum++;
seeked.innerHTML = seekedNum;
};

timeupdate监听视频播放的状态

        VideoNode.addEventListener('timeupdate',function(){
// 总时长,以分钟:秒的形式显示
let allTime = parseInt(VideoNode.duration/60)+':'+parseInt(VideoNode.duration%60);
// 当前时间,以分钟:秒的形式显示
let nowTime = parseInt(VideoNode.currentTime/60)+':'+parseInt(VideoNode.currentTime%60);
timeNode.innerHTML = nowTime+'/'+allTime;
})

readyState 视频的准备信息

        console.log(VideoNode.readyState);
setTimeout(function(){
console.log(VideoNode.readyState);
},500);

playbackRate 查看或设置视频的一个播放速度

        console.log(VideoNode.playbackRate)

Rate设置倍速

        //Rate设置0.5倍速
RateNode.children[0].onclick = function(){
VideoNode.playbackRate = 0.5;
};
//Rate设置1倍速
RateNode.children[1].onclick = function(){
VideoNode.playbackRate = 1;
};
//Rate设置2倍速
RateNode.children[2].onclick = function(){
VideoNode.playbackRate = 2;
};

loop的设置

        loopNode.onclick = function(){
if(VideoNode.loop == false){
this.innerHTML = '循环';
VideoNode.loop = true;
}
else{
this.innerHTML = '不循环';
VideoNode.loop = false;
}
};

src返回的数据

        console.log('src='+VideoNode.src);

currentSrc返回的数据

        console.log('currentSrc='+VideoNode.currentSrc);

监听ended事件

        VideoNode.addEventListener('ended',function(){
console.log('视频播放结束了');
VideoNode.play();
})

查看视频的网络状态

        console.log(VideoNode.networkState)

手动设置控件 controls

        VideoNode.controls = true;

手动设置静音 muted

        VideoNode.muted = true;

自定义视频播放器
放图

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
*{margin: 0;padding: 0;list-style: none;}
.outerNode{width: 540px;height: 332px;position: absolute;left: 50%;top: 50%;margin: -166px 0 0 -270px;box-shadow: 0 0 4px #5b606d;}
.outerNode .videoNode{
width: 540px;height: 305px;float: left;
background: black;
}
.outerNode .controlsNode{
width: 540px;height: 27px;float: left;background: url(images/ctrs_bg.gif) repeat-x;
} .outerNode .controlsNode .playNode{
float: left;width: 15px;height: 17px;margin: 6px 0 0 14px;
background: url(images/playNode.png) no-repeat;cursor: pointer;
}
.outerNode .controlsNode .pauseNode{
float: left;width: 15px;height: 17px;margin: 6px 0 0 14px;
background: url(images/pause.png) no-repeat;cursor: pointer;
} .outerNode .controlsNode .loadNode{width: 267px;height: 10px;margin: 9px 0 0 14px;float: left;background: url(images/load_bg.png) repeat-x;position: relative;}
.outerNode .controlsNode .loadNode .lineNode{
width: 0%;height: 7px;position: absolute;left: 0;top: 1px;
background: url(images/line_bg.png) repeat-x; }
.outerNode .controlsNode .loadNode .lineNode .lineRight{
width: 2px;height: 100%;position: absolute;right: 0;top: 0;
background: url(images/line_r_bg.png) no-repeat;
} .outerNode .controlsNode .loadNode .loadLeft{
height: 100%;width:3px ;position: absolute;left: 0;top: 0;
background: url(images/left_bg.png) no-repeat;z-index: 4;
}
.outerNode .controlsNode .loadNode .loadRight{
height: 100%;width:3px ;position: absolute;right: 0;top: 0;
background: url(images/right_bg.png) no-repeat;
}
.outerNode .controlsNode .loadNode .crlNode{width: 17px;height: 17px;background: url(images/crl_bg.png);position: absolute;left: -8.5px;top: -3.5px;cursor: pointer;z-index: 5;} .outerNode .controlsNode .timeNode{
float: left;width: 75px;height: 10px;margin: 9px 0 0 9px;
}
.outerNode .controlsNode .timeNode span{font-size:10px;float: left;line-height: 10px;color: white; }
.outerNode .controlsNode .volumeNode{
width: 17px;height: 16px;float: left;margin: 5px 0 0 6px;
background: url(images/volume_bg.png);
}
.outerNode .controlsNode .volumeLine{
height: 8px;width: 61px;float: left;margin: 10px 0 0 4px;
background: url(images/volumeLine_bg.png) repeat-x;position: relative;
}
.outerNode .controlsNode .volumeLine .v_left{
width: 3px;height:100%;position: absolute;left: 0;top: 0;background: url(images/v_left.png) no-repeat;
}
.outerNode .controlsNode .volumeLine .v_right{
width: 3px;height:100%;position: absolute;right: 0;top: 0;background: url(images/v_right.png) no-repeat;
}
.outerNode .controlsNode .volumeLine .v_DragNode{width: 15px;height: 13px;position: absolute;left: 58.5px;top: -3.5px;background: url(images/vo_d.png) no-repeat;cursor: pointer;}
.outerNode .controlsNode .fullNode{
width:15px;height:17px;float: left;margin: 6px 0 0 35px;
background: url(images/full_bg.png) no-repeat;cursor: pointer;
transition: 0.7s;
}
.outerNode .controlsNode .fullNode:hover{
background: url(images/full_hover_bg.png) no-repeat;
} </style> </head>
<body>
<!-- 最外层的元素 -->
<div class='outerNode'>
<!-- video元素 -->
<video class='videoNode' src='data/imooc.mp4' poster="data/poster.jpg"></video>
<!-- 控制器的元素 -->
<div class='controlsNode'>
<!-- 控制播放暂停的按钮 -->
<div class='playNode'></div>
<!-- video的进度条 -->
<div class='loadNode'>
<div class='loadLeft'></div>
<div class='loadRight'></div>
<!-- 拖动进度条的按钮 -->
<div class='crlNode'></div>
<!-- 真正的进度条 -->
<div class='lineNode'>
<div class='lineRight'></div>
</div>
</div>
<!-- 时间的元素 -->
<div class='timeNode'>
<span class='now'>00:00</span>
<span> - </span>
<span class='all'>4:30</span>
</div>
<!-- 声音的标志 -->
<div class='volumeNode'></div>
<!-- 声音的条 -->
<div class='volumeLine'>
<div class='v_left'></div>
<div class='v_right'></div>
<div class='v_DragNode'></div>
</div>
<!-- 全屏的按钮 -->
<div class='fullNode'></div>
</div>
</div>
<script type="text/javascript">
//播放暂停的控制
//PlayNode 播放器按钮
//VideoNode 播放器
//PlayBln 控制暂停播放的布尔值
//FullNode 全屏按钮
//nowNode 当前时间
//allNode 视频的全部时间
//LineNode 当前的进度条
//CrlNode 进度条按钮
//LoadNode 进度条外面的元素
var PlayNode = document.getElementsByClassName('playNode')[0],
VideoNode = document.getElementsByClassName('videoNode')[0],
FullNode = document.querySelector('.fullNode'),
nowNode = document.querySelector('.now'),
allNode = document.querySelector('.all'),
LineNode = document.querySelector('.lineNode'),
CrlNode = document.querySelector('.crlNode'),
LoadNode = document.querySelector('.loadNode'),
VDragNode = document.querySelector('.v_DragNode'),
PlayBln = true; //播放、暂停的事件
PlayNode.onclick = function(){
//传统的通过布尔值去改变classname的方法
PlayBln = !PlayBln;
if(PlayBln == false){
this.className = 'pauseNode';
VideoNode.play(); }
else{
this.className = 'playNode';
VideoNode.pause();
}
}; //全屏按钮的事件
FullNode.onclick = function(){
if(VideoNode.webkitRequestFullscreen){
VideoNode.webkitRequestFullscreen();
}
else if(VideoNode.mozRequestFullScreen){
VideoNode.mozRequestFullScreen();
}
else{
VideoNode.requestFullscreen();
}
}; //解决最开始时间的NAN的问题
VideoNode.addEventListener('canplay',function(){
var needTime = parseInt(VideoNode.duration);
var s = needTime%60;
var m = parseInt(needTime / 60);
var timeNum = toDou(m)+':'+toDou(s);
allNode.innerHTML = timeNum;
},false); //解决 时间不足10 的问题
function toDou(time){
return time<10?'0'+time:time;
} //当视频播放的时候 需要当前的时间动起来
VideoNode.addEventListener('timeupdate',function(){
//目前的 百分比进度
LineNode.style.width = VideoNode.currentTime/VideoNode.duration*100+'%';
CrlNode.style.left = LineNode.offsetWidth - 8.5 + 'px' var needTime = parseInt(VideoNode.currentTime);
var s = needTime%60;
var m = parseInt(needTime / 60);
var timeNum = toDou(m)+':'+toDou(s);
nowNode.innerHTML = timeNum;
},false); //声音的拖拽按钮
VDragNode.onmousedown = function(e){
var ev = e || event;
var l = ev.clientX - this.offsetLeft;
document.onmousemove = function(e){
var ev = e || event;
var needX = ev.clientX - l;
var maxX = VDragNode.parentNode.offsetWidth - 2.5; needX = needX < -2.5 ? - 2.5 : needX;
needX = needX > maxX ? maxX : needX;
//计算0 - 1
var lastVolume = (VDragNode.offsetLeft + 2) / VDragNode.parentNode.offsetWidth ;
VideoNode.volume = lastVolume < 0 ? 0 : lastVolume; VDragNode.style.left = needX + 'px';
};
document.onmouseup = function(e){
document.onmousemove = document.onmouseup = null;
}
return false;
}
//拖拽进度条按钮
CrlNode.onmousedown = function(e){
var ev = e || event;
var l = ev.clientX - this.offsetLeft;
VideoNode.pause(); document.onmousemove = function(e){
var ev = e || event;
var needX = ev.clientX - l;
var maxX = LoadNode.offsetWidth - 8.5; needX = needX < -8.5 ? -8.5 : needX;
needX = needX > maxX ? maxX : needX;
CrlNode.style.left = needX + 'px';
LineNode.style.width = (CrlNode.offsetLeft+9)/LoadNode.offsetWidth*100 + '%'; };
document.onmouseup = function(){
document.onmousemove = document.onmouseup = null;
VideoNode.currentTime = VideoNode.duration * (CrlNode.offsetLeft+9)/LoadNode.offsetWidth;
if(PlayBln == false){
//console.log(1);
PlayNode.className = 'pauseNode';
VideoNode.play();
}
else{
//console.log(2);
PlayNode.className = 'playNode';
VideoNode.pause();
}
};
return false;
}; </script>
</body>
</html>

HTML5视频(自定义视频播放器源码)的更多相关文章

  1. 易语言.开源(vip视频播放器源码)

    下载链接:https://pan.baidu.com/s/1ta1Ig3LOiOka-kr5xB18kw

  2. 项目源码--IOS自定义视频播放器

    下载源码 技术要点: 1. 视频播放器功能的实现 2. 视频文件的扫描与管理 3. Ipad UI的实现 4.源码详细的中文注释 ……. 详细介绍: 1. 视频播放器功能的实现 源码基于MediaPl ...

  3. 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  4. HTML5实现的视频播放器01

    HTML5实现的视频播放器   什么是hivideo? 最近一段时间在使用PhoneGap开发一个App应用,App需要播放视频,本想直接使用html5的video,但使用它在全屏播放时不支持横屏播放 ...

  5. android文件管理器源码、斗鱼直播源码、企业级erp源码等

    Android精选源码 文件清理管理器 自定义水平带数字的进度条以及自定义圆形带数字的进度条 利用sectionedRecyclerViewAdapter实现分组列表的recyclerView源码 流 ...

  6. 一步步实现windows版ijkplayer系列文章之三——Ijkplayer播放器源码分析之音视频输出——音频篇

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  7. 32.修改IK分词器源码来基于mysql热更新词库

    主要知识点, 修改IK分词器源码来基于mysql热更新词库     一.IK增加新词的原因 在第32小节中学习到了直接在es的词库中增加词语,来扩充自已的词库,但是这样做有以下缺点: (1)每次添加完 ...

  8. 让你心动的 HTML5 & CSS3 效果【附源码下载】

    这里集合的这组 HTML5 & CSS3 效果,有的是网站开发中常用的.实用的功能,有的是先进的 Web 技术的应用演示.不管哪一种,这些案例中的技术都值得我们去探究和学习. 超炫的 HTML ...

  9. 8个前沿的 HTML5 & CSS3 效果【附源码下载】

    作为一个前沿的 Web 开发者,对于 HTML5 和 CSS3 技术或多或少都有掌握.前几年这些新技术刚萌芽的时候,开发者们已经使用它们来小试牛刀了,如今这些先进技术已经遍地开发,特别是在移动端大显身 ...

随机推荐

  1. Flyway 的使用及Spring Boot集成Flyway

    一.简单介绍 Flyway 是一个开源.跨环境的数据库迁移工具,它强烈主张简单性和约定性而不是配置. Flyway 是一个便于多人开发对数据库管理的工具,将sql语句写入文件中,只需要在控制台输入指令 ...

  2. 二、Mongodb常用命令

    #进入admin数据库 use admin #进行权限认证 db.auth('userAdmin', '123456') #查询所有用户 db.system.users.find() #更新用户 db ...

  3. 工业狗转行AI的心路历程

    2020年2月16日,晴 昨晚下了一场雪,大概是晚上八九点的样子,细碎的雪花在无风的夜里直嗖嗖的往下掉,门前的轿车顶上覆了薄薄的一层.路灯下的小巷格外的寂静,裹着我的睡衣在昏黄的灯光下站了许久,冠状病 ...

  4. python练习——第0题

    原GitHub地址:https://github.com/Yixiaohan/show-me-the-code 题目:将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种 ...

  5. 【大白话系统】MySQL 学习总结 之 缓冲池(Buffer Pool) 的设计原理和管理机制

    一.缓冲池(Buffer Pool)的地位 在<MySQL 学习总结 之 InnoDB 存储引擎的架构设计>中,我们就讲到,缓冲池是 InnoDB 存储引擎中最重要的组件.因为为了提高 M ...

  6. shell脚本自动化部署

    由于公司技术部团队较小,没有专门的运维团队,所以运维工作技术部承包了. 一.纯人工部署是这样的: 1. 本地打包:一般 maven clean package 2. 借助xftp上传到服务器对应目录 ...

  7. 11-MyBatis01

    今日知识 1. MyBatis简介 2. MyBatis入门 3. 全局配置文件其他配置 4. MyBatis的映射文件 5. 动态SQL 6. mybatis和hibernate区别 MyBatis ...

  8. VFP中OCX控件注册检测及自动注册

    这是原来从网上搜集.整理后编制用于自己的小程序使用的OCX是否注册及未注册控件的自动注册函数. CheckCtrlFileRegist("ctToolBar.ctToolBarCtrl.4& ...

  9. LwIP与IPv6

    2.0.0中才开始支持IPv6,在此版本中改写了SNMP,但还没有IPv6的统计量.目前最新版本是2.0.2,其中SNMP也没有IPv6统计量(哪些?与IP的统计量有何区别?) 1.4.1中虽然有ip ...

  10. 记录KVM虚拟机常用操作管理命令

    环境说明 centos7中的KVM NAT方式是kvm安装后的默认方式.它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机. 检查当前的网络设置 # virsh net-li ...