博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从零实现一个自定义 HTML5 播放器
阅读量:6198 次
发布时间:2019-06-21

本文共 2234 字,大约阅读时间需要 7 分钟。

写在最前

本次的分享是一个基于HTML5标签实现的一个自定义视频播放器。其中实现了播放暂停、进度拖拽、音量控制及全屏等功能。

欢迎关注,不定期更新中——

效果预览

点我查看。

核心思路

我相信一定会有些没有接触过制作自定义播放器的童鞋对于标签的认识会停留在此。

复制代码

其中controls属性经过设定,会在界面中显示一个浏览器自带的控制条。如果对于UI没有要求的需求,其内置控制器已经可以满足大部分的需求。当然了如果是这样你们也不会看到这篇分享了=。=

隐藏控制条并模拟

那么实现一个自定义功能的播放器关键就在于,我们不使用原生的控制器,将其隐藏掉之后,在下方同样的位置通过html、css来模拟所需样式,同时通过js来调用vedio标签所暴露给我们的接口函数及属性,以及检测用户的操作行为来同步的模拟UI与视频播放数据的相应变化。

几个核心函数及属性的用法

myVid=document.getElementById("video1");//控制视频开关myVid.play() //播放myVid.pause() //暂停//模拟视频进度条myVid.currentTime=5; //返回或设定当前视频播放位置myVid.duration // 返回视频总长度//模拟视频音量myVid.volume //音量//获取视频当前状态后判断何时从loading切换为播放myVid.readyState//0 = HAVE_NOTHING - 没有关于音频/视频是否就绪的信息//1 = HAVE_METADATA - 关于音频/视频就绪的元数据//2 = HAVE_CURRENT_DATA - 关于当前播放位置的数据是可用的,但没有足够的数据来播放下一帧/毫秒//3 = HAVE_FUTURE_DATA - 当前及至少下一帧的数据是可用的//4 = HAVE_ENOUGH_DATA - 可用数据足以开始播放复制代码

在所有实现中的关键点,较为繁琐的是对于进度条的模拟。其中使用了video标签中的currentTime以及duration属性,通过当前播放时间与总播放时间的比值,就可以计算出进度条相对于总长的位置。同时用户通过拖拽进度条所最后设置的长度也可以用来反向推算出此时视频应该播放的位置。

拖拽代码思路

//核心代码示例var dragDis = 0var processWidth = xxx //拖拽条总长$('body').mousedown(function(e) {    startX = e.clientX    dragDis = startX - leftInit //leftInit为拖拽条起始点距屏幕左侧的距离    dragTarget.css({ //拖拽按钮        left: dragDis    })    dragProcess.css({ //进度条(蓝色进度条)        width: dragDis    }) // 令进度条和拖拽按钮渲染在同一位置    videoSource.pause()}).mousemove(function(e) {    moveX = e.clientX    disX = moveX - startX    var left = dragDis + disX    if(left > processWidth) {        left = processWidth    } else if(left < 0) {        left = 0    }    dragTarget.css({        left: left    })    dragProcess.css({        width: left    })}).mouseup(function(e) {    videoSource.play()    videoSource.currentTime = $('蓝色拖拽条').width() / processWidth * duration //拖拽后计算视频的正确播放位置})复制代码

同理音量的控制与其上行为基本一致,故在源码中作者将音量与进度部分通过不同元素进行判断是进行进度还是音量的拖拽控制。

通过查询视频流状态控制播放前的加载动画

function ifState() {    var state = videoSource.readyState    if(state === 4) { //状态为4即可播放        videoPlayer()    } else {        $('.play-sym-wrapper').remove()        $('body').append('
') //添加loading动画 setTimeout(ifState, 10) }}setTimeout(ifState, 10)复制代码

核心的控制部分已经说完了,有兴趣的同学可以去源码的html中点击播放,其中被迫有很多零碎的需求,比如点击暂停,保存音量等等。整个视频播放器的基础功能实现的还算完善。

最后

惯例po,不定时更新中——

有问题欢迎在issues下交流,捂脸求star=。=

转载地址:http://ffnca.baihongyu.com/

你可能感兴趣的文章
系统自动化安装
查看>>
几个jquery分发库速度测评
查看>>
spring的DI
查看>>
linux命令
查看>>
RedHat 学习笔记 基于ssl的httpd服务配置 (openssl创建CA)
查看>>
网站防御DDOS的PHP代码
查看>>
Android程序的调试--善用Log
查看>>
队列Queue
查看>>
浅析linux(三)
查看>>
mysql控制台导入导出数据库
查看>>
Win7 64位编译Python扩展解决”error: Unable to find vcvarsa
查看>>
赶集网mysql开发36军规
查看>>
PHP新手上路
查看>>
编程巨星的唯一秘诀
查看>>
JSP PHP ASP的区别!市场比例,为什么都在下降,求解答??? 我的JSP为什么这么可怜...
查看>>
数据库Sharding的基本思想和切分策略
查看>>
转:Google 的十大信条
查看>>
nodejs - nedb 封装库
查看>>
MariaDB在Centos7以上环境安装
查看>>
WebLogic11g-集群相关概念
查看>>