写在最前

本次的分享是一个基于HTML5标签实现的一个自定义视频播放器。其中实现了播放暂停、进度拖拽、音量控制及全屏等功能。
欢迎关注我的博客,不定期更新中——

效果预览

点我查看源码仓库。

核心思路

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

<video controls="controls" autoplay="autoplay"><source src="movie.ogg" type="video/ogg" />
</video>复制代码

其中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 = 0
var processWidth = xxx //拖拽条总长
$('body').mousedown(function(e) {startX = e.clientXdragDis = startX - leftInit //leftInit为拖拽条起始点距屏幕左侧的距离dragTarget.css({ //拖拽按钮left: dragDis})dragProcess.css({ //进度条(蓝色进度条)width: dragDis}) // 令进度条和拖拽按钮渲染在同一位置videoSource.pause()
}).mousemove(function(e) {moveX = e.clientXdisX = moveX - startXvar left = dragDis + disXif(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.readyStateif(state === 4) { //状态为4即可播放videoPlayer()} else {$('.play-sym-wrapper').remove()$('body').append('<div class="play-sym-wrapper"><img class="play-sym" src="./images/loading.gif"></div>')//添加loading动画setTimeout(ifState, 10)}
}
setTimeout(ifState, 10)复制代码

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

最后

惯例po作者的博客,不定时更新中——
有问题欢迎在issues下交流,捂脸求star=。=

从零实现一个自定义 HTML5 播放器相关推荐

  1. 教你自己做一个自定义的播放器 支持全屏,不支持窗口最大化、取消全屏

    v1: 最简单的视频播放器: from PyQt5.QtWidgets import QApplication, QFileDialog from PyQt5.QtMultimedia import ...

  2. html5 mp3播放器源码,HTML5自定义mp3播放器源码

    audio对象 src兼容.ogg .wav .mp3 width autoplay loop muted静音 播放play() var myAudio = new Audio(); myAudio. ...

  3. 自定义音频播放器_创建自定义HTML5音频播放器

    自定义音频播放器 在本教程中,我将向您介绍HTML5音频,并向您展示如何创建自己的播放器. 如果您想走捷径,请查看Envato市场上可用的现成的HTML5音频播放器 . 它使您可以从各种来源创建播放列 ...

  4. 网页html5播放器,一个强大的开源HTML5视频播放器,字节出品

    哈喽,大家好!现在短视频.直播十分的火,相信许多开发童鞋都遇到要在项目中加入视频组件的情况吧. 一般视频播放或者直播的前端组件都要有诸如弹幕.清晰度调整.倍数播放等功能,今天精选板给大家带来的就是这样 ...

  5. 优酷在线播放器 html5,GitHub - esterTion/Youku-HTML5-Player: 一个适配优酷的简单易用的HTML5播放器...

    本扩展将不再维护 目前的可用性状态(19/03/16): firefox 65 基本正常使用 chrome 73 已确认无法使用 This extension is no longer maintai ...

  6. 优酷原生html5播放器,GitHub - esterTion/Youku-HTML5-Player: 一个适配优酷的简单易用的HTML5播放器...

    本扩展将不再维护 目前的可用性状态(19/03/16): firefox 65 基本正常使用 chrome 73 已确认无法使用 This extension is no longer maintai ...

  7. html5+video手机样式修改,如何自定义video播放器样式?

    本篇文章给大家分享了关于如何自定义video播放器样式,内容很详细,希望可以帮助到大家. DIY 本文基于HTML5 Video API,自定义Web视频播放器样式. 其实吧,原生的video 标签样 ...

  8. 自己的HTML5 播放器

    不知道写什么,主要也是自己水平实在是有限,想想自己会的东西都太基本,网上一搜往后不知道能数多少页,自己表达的也没有别人好.我希望自己写的东西要么是网上没有(可能性就是零--),要么是带着自己的见解.所 ...

  9. 实现简单的自定义音乐播放器

    这篇博客只是记录自己写的js插件,着重点在于js,而不是css或者html.所以在js方面会比较详细,而其他的就只是简单提提. 刚学前端js那会,只是应付式的把书看完了,demo也没写几个.碰巧这学期 ...

最新文章

  1. 查看oracle的表空间使用,查看Oracle的表空间的使用情况
  2. [转载]“java.sql.SQLException:指定了无效的 Oracle URL”
  3. window下使用rtl-sdr和sdrsharp
  4. pythonfor循环语句例题_python循环语句的使用练习题
  5. 转转集团二手双11大促:长沙用户“秒杀”99新iPhone12成首单
  6. Docker学习总结(59)——DockerFIile相关知识点再总结
  7. Response.Cookie FF
  8. Java StringBuilder
  9. 2021高考成绩查询大学城一中,“有梦就去追,做勇于逐梦的少年”——直击重庆市2021年普通高考...
  10. iphone已停用怎么解锁_iPhone锁屏密码忘记了怎么办?维修店老板说出了绝招
  11. rf扫描枪_RF枪(RF手持扫描枪)是什么,有什么用途?
  12. 考研英语 常见不规则动词过去式/过去分词
  13. 路由器/交换机/服务器的分类
  14. java 判断条件_Java初学者:条件判断及其语句
  15. uniapp引用iconfont图标
  16. 处理textarea的空格和换行
  17. 网站开启https后很慢_安装SSL证书会导致网站访问速度变慢?
  18. 碳足迹分析软件市场现状研究分析报告-
  19. 2014多校联合-第七场
  20. 哔哩哔哩视频合并 B站缓存视频合并 安卓版 音视频合并 基于ffmpeg

热门文章

  1. 火狐SEO插件:查询网站收录与外链的火狐油猴脚本工具
  2. 从Java视角理解伪共享(False Sharing)
  3. 关于Javascript Hijacking
  4. Drupal 7模板(主题钩子)的建议
  5. 排序算法之——选择排序
  6. mysql默认安装目录说明
  7. Hightchart y轴不允许显示小数
  8. userscript.user.js 文件头
  9. 武汉游记,三件新鲜奇葩事
  10. 【WCF】 套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“00:00:56.9810000”。...