[h5]一个基于HTML5实现的视频播放器代码详解

article/2025/9/21 20:05:25

什么是 HTML5?

HTML5 是最新的 HTML 标准。

HTML5 是专门为承载丰富的 web 内容而设计的,并且无需额外插件。

HTML5 拥有新的语义、图形以及多媒体元素。

HTML5 提供的新元素和新的 API 简化了 web 应用程序的搭建。

HTML5 是跨平台的,被设计为在不同类型的硬件(PC、平板、手机、电视机等等)之上运行。

注释:HTML5 中默认的字符编码是 UTF-8。

HTML5 - 新特性

HTML5 的一些最有趣的新特性:

  • 新的语义元素,比如 <header>, <footer>, <article>, and <section>。
  • 新的表单控件,比如数字、日期、时间、日历和滑块。
  • 强大的图像支持(借由 <canvas> 和 <svg>)
  • 强大的多媒体支持(借由 <video> 和 <audio>)
  • 强大的新 API,比如用本地存储取代 cookie。


HTML5 浏览器支持

所有现代浏览器都支持 HTML5。

此外,所有浏览器,不论新旧,都会自动把未识别元素当做行内元素来处理。

正因如此,您可以帮助老式浏览器处理”未知的“ HTML 元素。


注释:您甚至可以教授石器时代的 IE6 如何处理未知的 HTML 元素。

Internet Explorer 的问题

上述方案可用于所有新的 HTML5 元素,但是:

注意:Internet Explorer 8 以及更早的版本,不允许对未知元素添加样式。

幸运的是,Sjoerd Visscher 创造了 "HTML5 Enabling JavaScript", "the shiv"

<!--[if lt IE 9]><script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->

以上代码是一段注释,但是 IE9 的早期版本会读取它(并理解它)。


HTML 代码约定

web 开发者常常不确定在 HTML 中使用的代码样式和语法。

在 2000 年至 2010 年之间,许多 web 开发者从 HTML 转换为 XHTML。

通过 XHTML,开发者不得不编写有效的“格式良好的”代码。

HTML5 在代码验证时会更宽松一点。

通过 HTML5,您必须创建属于自己的最佳实践、样式指南和代码约定


使用小写文件名

大多数 web 服务器(Apache、Unix)对文件名的大小写敏感:

不能以 london.jpg 访问 London.jpg。

其他 web 服务器(微软,IIS)对大小写不敏感:

能够以 london.jpg 或 London.jpg 访问 London.jpg。

如果使用混合大小写,那么您必须保持高度的一致性。

如果您从对大小写不敏感的服务器转到一台对大小写敏感的服务器上,这些小错误将破坏您的网站。

为了避免这些问题,请始终使用小写文件名(如果可以的话)。

文件扩展名

HTML 文件名应该使用扩展名 .html(而不是 .htm)。

CSS 文件应该使用扩展名 .css

JavaScript 文件应该使用扩展名 .js

关于内联视频的一段注释

当视频被包含在网页中时,它被称为内联视频。

如果您打算在 web 应用程序中使用内

联视频,您需要意识到很多人都觉得内联视频令人恼火。

同时请注意,用户可能已经关闭了浏览器中的内联视频选项。

我们最好的建议是只在用户希望看到内联视频的地方包含它们。一个正面的例子是,在用户需要看到视频并点击某个链接时,会打开页面然后播放视频。

HTML 4.01 多媒体标签

标签描述
<applet>不赞成。定义内嵌 applet。
<embed>不赞成。定义内嵌对象。(HTML5 中允许)
<object>定义内嵌对象。
<param>定义对象的参数。

HTML 5 多媒体标签

标签描述
<video>标签定义声音,比如音乐或其他音频流。
<embed>标签定义嵌入的内容,比如插件。

最好的 HTML 解决方法

HTML 5 + <object> + <embed>

<video width="320" height="240" controls="controls"><source src="movie.mp4" type="video/mp4" /><source src="movie.ogg" type="video/ogg" /><source src="movie.webm" type="video/webm" /><object data="movie.mp4" width="320" height="240"><embed src="movie.swf" width="320" height="240" /></object>
</video>

上例中使用了 4 中不同的视频格式。HTML 5 <video> 元素会尝试播放以 mp4、ogg 或 webm 格式中的一种来播放视频。如果均失败,则回退到 <embed> 元素。

问题

  • 您必须把视频转换为很多不同的格式
  • <video> 元素无法通过 HTML 4 和 XHTML 验证。
  • <embed> 元素无法通过 HTML 4 和 XHTML 验证。

注释:使用 <!DOCTYPE html> (HTML5) 解决验证问题。

优酷解决方案

在 HTML 中显示视频的最简单的方法是使用优酷等视频网站。

如果您希望在网页中播放视频,那么您可以把视频上传到优酷等视频网站,然后在您的网页中插入 HTML 代码即可播放视频:

<embed src="http://player.youku.com/player.php/sid/XMzI2NTc4NTMy/v.swf" 
width="480" height="400" 
type="application/x-shockwave-flash">
</embed>

使用超链接

如果网页包含指向媒体文件的超链接,大多数浏览器会使用“辅助应用程序”来播放文件。

以下代码片段显示指向 AVI 文件的链接。如果用户点击该链接,浏览器会启动“辅助应用程序”,比如 Windows Media Player 来播放这个 AVI 文件:

实例

<a href="movie.swf">Play a video file</a>

问题

  • HTML4 无法识别 <embed> 标签。您的页面无法通过验证。
  • 如果浏览器不支持 Flash,那么视频将无法播放
  • iPad 和 iPhone 不能显示 Flash 视频。
  • 如果您将视频转换为其他格式,那么它仍然不能在所有浏览器中播放。

使用 <object> 标签

<object> 标签的作用是在 HTML 页面中嵌入多媒体元素。

下面的 HTML 片段显示嵌入网页的一段 Flash 视频:

实例

<object data="movie.swf" height="200" width="200"/>

问题

  • 如果浏览器不支持 Flash,将无法播放视频。
  • iPad 和 iPhone 不能显示 Flash 视频。
  • 如果您将视频转换为其他格式,那么它仍然不能在所有浏览器中播放。

使用 <video> 标签

<video> 是 HTML 5 中的新标签。

<video> 标签的作用是在 HTML 页面中嵌入视频元素。

以下 HTML 片段会显示一段嵌入网页的 ogg、mp4 或 webm 格式的视频:

实例

<video width="320" height="240" controls="controls"><source src="movie.mp4" type="video/mp4" /><source src="movie.ogg" type="video/ogg" /><source src="movie.webm" type="video/webm" />
Your browser does not support the video tag.
</video>

问题

  • 您必须把视频转换为很多不同的格式。
  • <video> 元素在老式浏览器中无效。
  • <video> 元素无法通过 HTML 4 和 XHTML 验证。

什么是hivideo?

    最近一段时间在使用PhoneGap开发一个App应用,App需要播放视频,本想直接使用html5的video,但使用它在全屏播放时不支持横屏播放,只能放弃。最终决定还是自己封装一个播放器算了,免得以后要扩展功能麻烦。

    最近迷上hi这个单词,所以我给这个播放器取名叫做:hivideo。

    hivideo是一款基于html5的视频播放器,摒弃video原有的播放控制条样式,自己重写了一次。支持暂停、播放进度控制、声音控制、全屏播放。如果是要在手机端使用hivideo,全屏播放时还支持横屏播放。

    hivideo最终实现的效果如下:

image

如何使用hivideo?

    hivideo目录结构:

复制代码
assets----images----hivideo.csshivideo.js
复制代码

    要想使用hivideo,首先得在主界面引入样式hivideo.css文件。

<link rel="stylesheet" href="assets/hivideo.css" />

    hivideo.js文件可在主页面直接引用,同时也支持CommonJs、AMD规范。

    在需要转换为hivideo播放器的video标签上添加属性:

<video ishivideo="true"></video>

    hivideo会自动把上面的video元素转换为hivideo播放器。我们还可以在video标签上设置播放属性:

    1.autoplay: 自动播放。

    2.isrotate:全屏是否横屏播放,如果在手机端使用hivideo,我们可以设置该属性为true,表示全屏播放时横屏显示。

    3.autoHide:播放视频时自动隐藏控制条。

    使用方式:

<video ishivideo="true" autoplay="true" isrotate="false" autoHide="true"><source src="http://www.html5videoplayer.net/videos/madagascar3.mp4" type="video/mp4">
</video>

    如果是后期动态添加的video元素,也可以通过hivideo动态加载。例如页面动态添加了一个id为”player”的video元素,可通过如下方式把video转换为hivideo播放器:

hivideo(document.getElementById("player"));

 

    在线演示Demo:https://heavis.github.io/hivideo/index.html

    开源地址:https://github.com/heavis/hivideo

如何隐藏浏览器的播放器样式

    目前大多数浏览器都支持video元素,并且不同浏览器实现的video样式也不尽相同。

    chrome实现的播放器样式:

image

    Firefox实现的播放器样式:

image

    IE实现的播放器样式:

image

   

    为了让播放器在各个浏览器下样式统一,首先要隐藏各个浏览器实现的样式。但一般我们通过浏览器开发工具查看不到播放器下的元素,因为这些元素都是阴影元素,它们是通过文档片段附加到video上,对于文档流是不可见的。
    如何查看浏览器下的阴影元素?Chrome为开发人员提供了可选项,打开开发者工具->Settings->General页签,我们能看到Elments有一个叫做”Show user agent shadow DOM”的选项:

image

    勾选上该选项,现在我们通过开发工具可以查看到video下的播放元素:

image

    上图中<div pseudo=”-webkit-media-controls”>元素就是控制条的容器,我们只要设置它的display为none就可以隐藏掉控制条,但也需要兼容各个浏览器:

复制代码
video[ishivideo="true"]::-webkit-media-controls{
display:none !important;
}video[ishivideo="true"]::-moz-media-controls{
display:none !important;
}video[ishivideo="true"]::-o-media-controls{
display:none !important;
}video[ishivideo="true"]::media-controls{
display:none !important;
}
复制代码

    这里我遇到一个费解的问题,把上面的样式通过合并的方式写是无效的,下面的写法不能隐藏掉阴影元素:

复制代码
video[ishivideo="true"]::-webkit-media-controls,
video[ishivideo="true"]::-moz-media-controls,
video[ishivideo="true"]::-o-media-controls,
video[ishivideo="true"]::media-controls{display:none !important;
}
复制代码

 

    隐藏浏览器阴影元素后就可以开始动手实现自己的控制条了。实现之前,我们得了解video提供的API。

播放器常用API

    各个浏览器操作播放器提供的API名称一般都带有厂商前缀,所有基本上每一个API函数都对应多个版本,需要考虑兼容性。

    1.全屏事件

复制代码
["fullscreenchange", "webkitfullscreenchange", "mozfullscreenchange", "MSFullscreenChange"].forEach(function(eventType){document.addEventListener(eventType, function(event){})
});
复制代码

    如果播放器全屏状态放生变化上面的事件就会触发。上面的事件我们只知道全屏状态发生变化,但不知道当前是进入全屏还是退出全屏。还需要结合全屏状态API。

 

    2.当前是否全屏状态

复制代码
hivideo.prototype.isFullScreen = function(){return document.fullscreenElement ||document.webkitFullscreenElement ||document.mozFullScreenElement || document.msFullscreenElement;
};
复制代码

    上面是hivideo封装的判断是否全屏的函数。

 

    3.进入全屏模式

复制代码
if (video.requestFullscreen) {video.requestFullscreen();
} else if (video.webkitRequestFullscreen) {video.webkitRequestFullscreen();
} else if (video.mozRequestFullScreen) {video.mozRequestFullScreen();
} else if (video.msRequestFullscreen) {video.msRequestFullscreen();
}
复制代码

     

    4.退出全屏模式

复制代码
if (document.exitFullscreen) {document.exitFullscreen();
} else if (document.webkitExitFullscreen) {document.webkitExitFullscreen();
} else if (document.mozCancelFullScreen) {document.mozCancelFullScreen();
} else if (document.msExitFullscreen) {document.msExitFullscreen();
}
复制代码

   

    5.播放状态

    video.paused:true表示未播放, false表示正在播放。

 

    6.播放视频

    video.play()

 

    7.暂停播放
    video.pause()

 

    8.是否静音
    video.muted = true, 静音
    Video.muted = false,不静音

 

    9.声音控制

    设置video.volume控制声音,值的范围0到100。

 

    10.当前播放时间
    video.currentTime,可读可写,单位为妙。可通过<input type=’range’>的值显示播放进度。
   

    11.视频总周期
    video.duration,单位为妙。

    12.播放时间更新事件

video.addEventListener("timeupdate", function(){
});

   

    13.视频元数据加载完成事件

    一般播放视频时都会显示视频总时长,触发loadedmetadata事件时元数据已经加载完成,所以可以在该事件中设置总时长的显示。

video.addEventListener("loadedmetadata", function(){
}

 

    14.视频播放结束事件

video.addEventListener("ended", function(){
}

 

    有了上面列出的API,要实现自定义播放器就比较容易了,在自己实现播放器的过程中对应位置调用对应API即可。

如何实现横屏播放

    原理很简单,在全屏时播放器容器沾满了整个屏幕,我们可以给容器附加一个自定义样式,让容器旋转90度。

复制代码
.rotate90{-webkit-transform: rotate(90deg);-moz-transform: rotate(90deg);-ms-transform: rotate(90deg);-o-transform: rotate(90deg);transform: rotate(90deg);
}
复制代码

    旋转后的容器宽度和高度也要调整,需要把屏幕的高度screen.height赋给容器的宽度,而容器的高度设置为屏幕的宽度。这样就实现了全屏播放效果。下面是全屏播放控制的完整代码:

复制代码
hivideo.prototype.bindFullEvent = function(){var self = this;var origWidth = origHeight = 0;["fullscreenchange", "webkitfullscreenchange", "mozfullscreenchange", "MSFullscreenChange"].forEach(function(eventType){var curFullhivideoId = null;document.addEventListener(eventType, function(event){if((curFullhivideoId = document.body.getAttribute("curfullHivideo")) && curFullhivideoId !== self.videoId_ ){return;}var isRotate = self.options.isrotate;if(self.isFullScreen()){var cltHeight = isRotate ? window.screen.width : window.screen.height;var cltWidth = isRotate ? window.screen.height : window.screen.width;if(isRotate && !hivideo.hasClass(self.videoParent, "rotate90")){hivideo.addClass(self.videoParent, "rotate90");}self.videoParent.style.height = cltHeight + "px";self.videoParent.style.width = cltWidth + "px";}else{if(isRotate) self.videoParent.className = self.videoParent.className.replace("rotate90", "").trim();self.videoParent.style.height = origHeight + "px";self.videoParent.style.width = origWidth + "px";}})});self.fullBtn && self.fullBtn.addEventListener("click", function(){if(!self.isFullScreen()){document.body.setAttribute("curfullHivideo", self.videoId_);origWidth = self.videoParent.offsetWidth;origHeight = self.videoParent.offsetHeight;// go full-screenif (self.videoParent.requestFullscreen) {self.videoParent.requestFullscreen();} else if (self.videoParent.webkitRequestFullscreen) {self.videoParent.webkitRequestFullscreen();} else if (self.videoParent.mozRequestFullScreen) {self.videoParent.mozRequestFullScreen();} else if (self.videoParent.msRequestFullscreen) {self.videoParent.msRequestFullscreen();}self.exchangeBtnStatus(this, false);}else{// exit full-screenif (document.exitFullscreen) {document.exitFullscreen();} else if (document.webkitExitFullscreen) {document.webkitExitFullscreen();} else if (document.mozCancelFullScreen) {document.mozCancelFullScreen();} else if (document.msExitFullscreen) {document.msExitFullscreen();}self.exchangeBtnStatus(this, true);}});return self;
};
复制代码

支持CommonJS、AMD规范

    1.CommonJS支持

复制代码
(function(global, factory){"use strict";//支持commonJs规范if(typeof module === "object" && typeof module.exports === "object"){module.exports = factory(global);}else{factory(global);}
}(typeof window !== "undefined" ? window : this, function(window)
}
复制代码

    2.AMD支持

复制代码
//支持AMD规范
if (typeof define === "function" && define.amd){define("hivideo", [], function(){return hivideo;})
}
复制代码

 

    如果本篇内容对大家有帮助,请点击分享。你们的评价就是博主的动力!


http://chatgpt.dhexx.cn/article/Xl64KLF5.shtml

相关文章

一个牛逼的开源 H5 视频播放器

【公众号回复 “1024”&#xff0c;免费领取程序员赚钱实操经验】 大家好&#xff0c;我是章鱼猫。今天给大家分享的这个开源项目&#xff0c;对于前端开发者来讲非常非常的有用。因为它是一个 H5 的视频播放器。 字节跳动出品&#xff0c;必属精品啊&#xff01;尤其是我感觉在…

H5移动端页面使用DPlayer视频播放器

背景&#xff1a; 如果使用原生video标签&#xff0c;那在不同类型手机浏览器上样式都不一样&#xff0c;而且播放表现不一样&#xff0c;比如使用css隐藏播放按钮在PC端有效&#xff0c;在手机端就无效&#xff0c;故我们选择引入第三方成熟的播放器。 需求&#xff1a; 1、自…

13款用于Web的流行HTML5视频播放器

​​​​​​当视频流媒体席卷通信世界&#xff0c;为了保持和提升用户增长&#xff0c;内容创造者和流媒体服务提供者需要提供高质量的用户体验。而想要实现这一点&#xff0c;他们都需要在自己的网站上内嵌HTML5视频播放器。 在本文中&#xff0c;我们将来了解一下现在市面上…

分位数回归的实现方法

目录 分位数回归简介实现方法参考文献 分位数回归简介 简介参照可参照参考文献【1】。如下图&#xff0c;散点图代表我们所需分析数据&#xff0c;若用简单的参数方程拟合&#xff0c;即只利用期望值&#xff0c;会损失很多数据特征。因此分位数回归就可以乘风破浪了。 分位数…

分位数回归(Quantile Regression)代码解析

实验代码 本文采用python sklearn库中&#xff0c;作为quantile regression的示例代码。以下为详细解析&#xff1a; import numpy as np import matplotlib.pyplot as pltfrom sklearn.ensemble import GradientBoostingRegressor %matplotlib inline np.random.seed(1) #设…

python中的分位数回归(初探)

分位数回归 参考文献 Python statsmodels 介绍 - 树懒学堂 (shulanxt.com) Quantile Regression - IBM Documentation https://www.cnblogs.com/TMesh/p/11737368.html 传统的线性回归模型 其的求解方式是一个最小二乘法&#xff0c;保证观测值与你的被估值的差的平方和应…

分位数回归 Quantile Regression,python 代码

偶尔在机器学习的论文中了解到了分位数回归&#xff0c;发现这个方法应用也满广的。 文章目录 1. 分位数回归的数学原理2. 分位数回归的求解原理3 python 分位数回归 1. 分位数回归的数学原理 一般的回归方法是最小二乘法&#xff0c;即最小化误差的平方和&#xff1a; min ⁡…

实证操作:R语言实现分位数回归的介绍

“分位数回归是估计一组回归变量X与被解释变量Y的分位数之间线性关系的建模方法。从最小二乘法可以看出,传统回归中最小化残差的平方极易受极端值的影响,而且属于均值回归,这种方法不能得到不同分布下的数据关系 导入程序包与数据 分位数回归不考虑同方差、正态分布的假设,…

分位数回归

分位数&#xff08;Quantile&#xff09;&#xff0c;亦称分位点&#xff0c;是指将一个随机变量的概率分布范围分为几个等份的数值点&#xff0c;常用的有中位数&#xff08;即二分位数&#xff09;、四分位数、百分位数等。 任意一个累计分布函数 F ( x ) F(x) F(x) &#…

多元线性模型的分位数回归

多元线性模型的分位数回归 一、为什么要使用分位数回归&#xff1f;二、分位数回归基本模型三、分位数回归估计--线性规划3.1损失函数3.2目标函数3.3线性规划3.4回归算法 四、实际案例分析与python编程计算4.1引入数据集4.2计算 β ^ \widehat{\beta} β ​ 五、参考文献 一、为…

R语言的分位数回归

回归是科研中最常见的统计学研究方法之一&#xff0c;在研究变量间关系方面有着极其广泛的应用。由于其基本假设的限制&#xff0c;包括线性回归及广义线性回归在内的各种常见的回归方法都有三个重大缺陷&#xff1a;(1)对于异常值非常敏感&#xff0c;极少量的异常值可能导致结…

分位数回归--基于R

分位数回归 分位数回归是估计一组回归变量X与被解释变量Y的分位数之间线性关系的建模方法。以往的回归模型实际上是研究被解释变量的条件期望。而人们也关心解释变量与被解释变量分布的中位数、分位数呈何种关系。它最早由Koenker和Bassett(1978)提出。OLS回归估计量的计算是基…

基于R语言的分位数回归(quantile regression)

分位数回归&#xff08;quantile regression&#xff09; 这一讲&#xff0c;我们谈谈分位数回归的知识&#xff0c;我想大家传统回归都经常见到。分位数回归可能大家见的少一些&#xff0c;其实这个方法也很早了&#xff0c;大概78年代就有了&#xff0c;但是那个时候这个理论…

分位数回归和stata

分位数回归与stata 找了半天也没找到我想看的那种完整点的stata教程&#xff0c;只好自己写一个了… 参考教材&#xff1a;《用STATA学微观计量经济学》&《高级计量经济学及STATA应用_第2版》 第一部分 纯理论 更加详细的百度吧&#xff0c;很长很长&#xff0c;这里主要是…

分位数回归的求解

分位数回归 分位数回归实际上是一种特殊的 ℓ 1 \ell_1 ℓ1​回归问题&#xff0c;特别地&#xff0c;当所求分位数 τ 0.5 \tau0.5 τ0.5时就是中位数回归。 1 线性规划 1.1 将分位数回归看做是线性规划问题来求解 一般的&#xff0c;线性回归问题可以写为 ℓ p \ell_p ℓ…

分位数回归模型学习笔记

我读硕士老师给我的第一篇论文就是一个分位数回归的文章&#xff0c;当时觉得这个模型很简单&#xff0c;我很快就用R的示例文件写了一个例子&#xff0c;但是&#xff0c;在后面的研究中&#xff0c;我越来越觉得&#xff0c;这个模型没有我想的那么简单&#xff0c;而且有着非…

Python统计学11——分位数回归

分位数回归也是数理统计里面经典的模型&#xff0c;他相对于在最小二乘模型上进行了改进&#xff0c;虽然本身还是线性的参数模型&#xff0c;但对损失函数进行了改进。我们都知道最小二乘的损失函数是均方误差最小&#xff0c;分位数的损失函数是&#xff1a; 可以看到分位数损…

分位数回归(quantile regression)R实现

分位数回归&#xff08;quantile regression&#xff09;R实现 一、基本介绍二、使用分位数回归的原因三、R 语言实现分位数回归 一、基本介绍 回归分析的主要目的&#xff1a;实证检验理论分析中因变量与自变量之间的关系。传统的均值回归&#xff0c;主要使用因变量的条件均…

分位数回归(Stata)

基于分位数回归的成都空气质量指数的数据分析 空气质量指数计算公式为&#xff1a; &#xff08;1&#xff09;线性回归模型得到的是一种条件均值&#xff0c;并未考虑到因变量总体上的分布特征&#xff0c;在需要了解因变量位置&#xff08;分位数&#xff09;上的信息时&…

分位数回归—R语言实现

大家好&#xff0c;我是带我去滑雪&#xff0c;每天教你一个小技巧&#xff01; 分位数回归—R语言实现 1、分位数基本介绍——什么是分位数&#xff1f; 2、分位数回归用途——为什么要使用分位数回归&#xff1f; 3、图形分析——如何进行分位数回归图像分析&#xff1f; …