自己动手做一款HTML5视频播放器

2024-02-22 08:32

本文主要是介绍自己动手做一款HTML5视频播放器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

自己动手做一款HTML5视频播放器

        第一步:获取播放器
        第二步:实现播放与暂停
        第三步:实现全屏操作
        第四步:实现播放的逻辑
        第五步:实现播放过程的逻辑
        第六步:实现视频的跳播
        第七步:播放完毕后重置播放器的状态


在html5中播放 视频 和 音频 有单独的语义标签

//播放视频
<video src="" controls autoplay loop></video> 
//播放音频
<audio  src="" controls loop></audio>

其中 controls 属性可以控制播放
但是遗憾的是在每个浏览器中的显示效果却并不相同
我们可以自定义视频播放器使视频播放器在所有浏览器都有相同样式
html5中提供了很多多媒体接口
常用方法:

load() 加载

play() 播放

pause() 暂停

常用属性:

currentTime 视频播放的当前进度

duration 视频的总时间 100000/60 (以秒为单位 ,同时带有小数点)

paused 视频播放的状态

常用事件:

oncanplay: 事件在用户可以开始播放视频/音频(audio/video)时触发。

ontimeupdate: 通过该事件来报告当前的播放进度.

onended: 播放完时触发—重置

有了HTML5提供的多媒体接口,我们可以开始自定义播放器了
我使用了jquery来创建,因为操纵元素比较方便,但是由于JQuery中没有提供视频音频的控件,所以要将jq元素转化为原生的js—DOM元素

结构:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="css/font-awesome.css"><link rel="stylesheet" href="css/css.css">
</head>
<body>
<h3 class="playerTitle">视频播放器</h3>
<div class="player"><video src="mp4/chrome.mp4"></video><div class="controls"><a href="javascript:;" class="switch fa fa-play"></a><a href="javascript:;" class="expand fa fa-expand"></a><div class="progress"><div class="bar"></div><div class="loaded"></div><div class="elapse"></div></div><div class="time"><span class="currentTime">00:00:00</span>\<span class="totalTime">00:00:00</span></div></div>
</div>
<script src="jquery.min.js"></script>

 

第一步:获取播放器

将jq对象转化为DOM对象

<script src="jquery.min.js"></script>
<script>
$(function ($) {var video = $("video")[0];

 

第二步:实现播放与暂停

如果此时是暂停,那么显示播放,此时播放,显示暂停
判断当前播放状态: paused
播放:play()
暂停:pause()

$(".switch").on("click",function () {if (video.paused) {video.play();/*移除暂停样式 添加播放样式*/}else{video.pause();/*移除播放样式,添加暂停样式*/}/*设置标签的样式*/$(this).toggleClass("fa-play fa-pause");});

 

第三步:实现全屏操作

由于html5在浏览器中兼容性不强,所以要实现全屏操作使用 requestFullscreen 方法需要添加浏览器前缀

$(".expand").on("click",function () {/*全屏>>不同浏览器添加不同前缀*/if (video.requestFullscreen) {video.requestFullscreen();}else if (video.webkitRequestFullscreen) {video.webkitRequestFullscreen();}else if (video.mozRequestFullScreen) {video.mozRequestFullScreen();}else if (video.mozRequestFullscreen) {video.mozRequestFullscreen();}});

 

 

第四步:实现播放的逻辑

当视频文件可以播放时触发 oncanplay 事件
此时可以将视频显示出来,但是突然显示会有些突兀,所以需要控制时间

video.oncanplay = function () {setTimeout(function () {/*1.将视频文件设置为显示*/video.style.display = "block";/*2.获取当前文件的总时长 : 计算出 时分秒* duration:是以秒为单位,同时获取了小数值* */var total = video.duration; /*3.计算时分秒*/     var result = getResult(total);/*4.将计算结果展示在DOM元素中*/$(".totalTime").html(result);},2000);};

 

将计算时分秒的方法封装成函数,使用更加方便

   function getResult(totalTime){/*时*/var hour =Math.floor(totalTime / 3600);/*补0操作*/hour = hour < 10 ? "0" +hour : hour;/*分*/var minute = Math.floor(totalTime % 3600 / 60);minute = minute < 10 ? "0" +minute : minute;/*秒*/var second = Math.floor(totalTime % 60);second = second < 10 ? "0" +second : second;/*返回结果*/return hour+":"+minute+":"+second;}

 

第五步:实现播放过程的逻辑

在播放的过程中,当前时间以及进度条都会变化
当视频播放时会触发 ontimeupdate事件,并且修改 currentTime 值 也会触发这个事件 说白了 只要currentTime 变化 就会触发这个事件
进度条的变化就是元素宽度值的变化,将元素宽度值设置为百分比
元素宽度 百分比 等于 当前时间 占 总时间 的比值 的百分比

    video.ontimeupdate = function () {/*1.获取当前的播放时间*/var current = video.currentTime;/*2.计算出时分秒*/var result = getResult(current);/*3.将结果展示在指定的DOM中*/$(".currentTime").html(result);/*4.设置当前播放进度条样式 例如0.12 >> 0.12*100 = 12 + % >> 12% */var percent = current / video.duration * 100 + "%";$(".elapse").css("width",percent);}

 

第六步:实现视频的跳播

如何跳播?

    在整个进度条上添加一个透明的div,放在最高层( 点击时点击到的是最高层的透明div ) 显示点击之后的进度条
    点击时使用事件处理函数e来获取到鼠标点击的位置

    $(".bar").on("click",function(e){/*1.获取当前鼠标相对于父元素的left值--- 偏移值*/var offset = e.offsetX;/*2.计算偏移值相对于总父元素宽度的比例*/var percent = offset / $(this).width();/*3.计算这个位置对应的视频进度值*/var current = percent * video.duration;/*4.设置当前视频的currentTime*/video.currentTime = current;})

 

第七步:播放完毕后重置播放器的状态

 video.onended = function () {video.currentTime = 0;$(".switch").removeClass("fa-pause").addClass("fa-play");}

 

注意: 使用webstrom打开网页有坑,不能跳播,因为webstrom对视频播放的支持度比较少,所以直接找到文件打开,就可以跳播了

最后附上css样式

body {padding: 0;margin: 0;font-family: 'microsoft yahei', 'Helvetica', simhei, simsun, sans-serif;background-color: #F7F7F7;
}a {text-decoration: none;
}
.playerTitle{width:100%;margin: 0 auto;line-height:100px;font-size: 40px;text-align: center;
}
.player{width: 720px;height: 360px;margin: 0 auto;background: url("../images/loading.gif") center no-repeat;background-size: cover;position: relative;
}
video{height:100%;margin: 0 auto;display: none;
}
.controls {width: 720px;height: 40px;position: absolute;left: 0px;bottom: -40px;background-color: #000;
}
.controls > .switch{width: 20px;height: 20px;display: block;font-size: 20px;color: #fff;position: absolute;left: 10px;top: 10px;
}
.controls > .expand{width: 20px;height: 20px;display: block;font-size: 20px;color: #fff;position: absolute;right: 10px;top: 10px;
}
.controls > .progress{width: 430px;height: 10px;position: absolute;left:40px;bottom:15px;background-color: #555;
}
.controls > .progress > .bar{width:100%;height:100%;border-radius: 3px;cursor: pointer;position: absolute;left: 0;top: 0;opacity: 0;z-index: 999;
}
.controls > .progress > .loaded{width:60%;height:100%;background-color: #999;border-radius: 3px;position: absolute;left: 0;top: 0;z-index: 2;
}
.controls > .progress > .elapse{width:0%;height:100%;background-color: #fff;border-radius: 3px;position: absolute;left: 0;top: 0;z-index: 3;
}
.controls > .time{height: 20px;position: absolute;left:490px;top: 10px;color: #fff;font-size: 14px;
}

 来源:https://blog.csdn.net/weixin_44159735/article/details/86438590

这篇关于自己动手做一款HTML5视频播放器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/734691

相关文章

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

css中的 vertical-align与line-height作用详解

《css中的vertical-align与line-height作用详解》:本文主要介绍了CSS中的`vertical-align`和`line-height`属性,包括它们的作用、适用元素、属性值、常见使用场景、常见问题及解决方案,详细内容请阅读本文,希望能对你有所帮助... 目录vertical-ali

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Vue 调用摄像头扫描条码功能实现代码

《Vue调用摄像头扫描条码功能实现代码》本文介绍了如何使用Vue.js和jsQR库来实现调用摄像头并扫描条码的功能,通过安装依赖、获取摄像头视频流、解析条码等步骤,实现了从开始扫描到停止扫描的完整流... 目录实现步骤:代码实现1. 安装依赖2. vue 页面代码功能说明注意事项以下是一个基于 Vue.js

CSS @media print 使用详解

《CSS@mediaprint使用详解》:本文主要介绍了CSS中的打印媒体查询@mediaprint包括基本语法、常见使用场景和代码示例,如隐藏非必要元素、调整字体和颜色、处理链接的URL显示、分页控制、调整边距和背景等,还提供了测试方法和关键注意事项,并分享了进阶技巧,详细内容请阅读本文,希望能对你有所帮助...

Nginx实现前端灰度发布

《Nginx实现前端灰度发布》灰度发布是一种重要的策略,它允许我们在不影响所有用户的情况下,逐步推出新功能或更新,通过灰度发布,我们可以测试新版本的稳定性和性能,下面就来介绍一下前端灰度发布的使用,感... 目录前言一、基于权重的流量分配二、基于 Cookie 的分流三、基于请求头的分流四、基于请求参数的分

基于Canvas的Html5多时区动态时钟实战代码

《基于Canvas的Html5多时区动态时钟实战代码》:本文主要介绍了如何使用Canvas在HTML5上实现一个多时区动态时钟的web展示,通过Canvas的API,可以绘制出6个不同城市的时钟,并且这些时钟可以动态转动,每个时钟上都会标注出对应的24小时制时间,详细内容请阅读本文,希望能对你有所帮助...

HTML5 data-*自定义数据属性的示例代码

《HTML5data-*自定义数据属性的示例代码》HTML5的自定义数据属性(data-*)提供了一种标准化的方法在HTML元素上存储额外信息,可以通过JavaScript访问、修改和在CSS中使用... 目录引言基本概念使用自定义数据属性1. 在 html 中定义2. 通过 JavaScript 访问3.