HTML5 Video标签详细教程
HTML5 Video标签详细教程
简介
HTML5引入的<video>标签为网页提供了原生视频播放功能,无需依赖Flash等第三方插件。它使得在网页中嵌入和控制视频内容变得简单而强大。本教程将详细介绍<video>标签的使用方法、属性、事件以及相关技术。
基本用法
最简单的视频嵌入
<video src="movie.mp4" controls></video>
带有后备内容的视频嵌入
<video controls><source src="movie.mp4" type="video/mp4"><source src="movie.webm" type="video/webm"><p>您的浏览器不支持HTML5视频。这里是<a href="movie.mp4">视频链接</a>。</p>
</video>
属性详解
标签支持多种属性来控制视频的播放行为:
| 属性 | 值 | 说明 |
|---|---|---|
src | URL | 视频文件的URL |
controls | controls | 显示播放控件 |
width | pixels | 视频播放器宽度 |
height | pixels | 视频播放器高度 |
autoplay | autoplay | 视频自动播放(不推荐) |
muted | muted | 视频静音 |
loop | loop | 视频循环播放 |
poster | URL | 视频封面图片URL |
preload | auto/metadata/none | 视频预加载方式 |
playsinline | playsinline | 使视频在iOS设备上不全屏播放 |
poster属性
<video controls poster="preview.jpg"><source src="movie.mp4" type="video/mp4">
</video>
preload属性选项
auto:浏览器自动加载整个视频metadata:只加载视频元数据(时长、尺寸等)none:不预加载视频
<video preload="metadata" controls><source src="movie.mp4" type="video/mp4">
</video>
格式支持
不同浏览器支持不同的视频格式,常见的视频格式有:
| 格式 | MIME类型 | 浏览器支持 |
|---|---|---|
| MP4 | video/mp4 | Chrome, IE9+, Safari, Firefox, Opera |
| WebM | video/webm | Chrome, Firefox, Opera |
| Ogg | video/ogg | Chrome, Firefox, Opera |
为了最大兼容性,建议提供多种格式:
<video controls><source src="movie.mp4" type="video/mp4"><source src="movie.webm" type="video/webm"><source src="movie.ogv" type="video/ogg">
</video>
事件处理
元素支持多种事件,可用于监控和控制视频播放:
| 事件 | 说明 |
|---|---|
play | 视频开始播放 |
pause | 视频暂停 |
ended | 视频播放结束 |
timeupdate | 当前播放位置改变 |
volumechange | 音量改变 |
loadedmetadata | 视频元数据加载完成 |
loadeddata | 视频当前帧加载完成 |
canplay | 视频可以播放但可能需要缓冲 |
canplaythrough | 视频可以流畅播放 |
error | 视频加载错误 |
示例:
<video id="myVideo" controls><source src="movie.mp4" type="video/mp4">
</video><script>const video = document.getElementById('myVideo');video.addEventListener('play', function() {console.log('视频开始播放');});video.addEventListener('pause', function() {console.log('视频暂停');});video.addEventListener('ended', function() {console.log('视频播放结束');});
</script>
JavaScript控制
通过JavaScript可以完全控制视频播放:
const video = document.getElementById('myVideo');// 播放/暂停
function togglePlay() {if (video.paused) {video.play();} else {video.pause();}
}// 进度跳转
function seekTo(time) {video.currentTime = time;
}// 调整音量 (0.0 - 1.0)
function setVolume(vol) {video.volume = vol;
}// 静音切换
function toggleMute() {video.muted = !video.muted;
}// 全屏
function enterFullScreen() {if (video.requestFullscreen) {video.requestFullscreen();} else if (video.webkitRequestFullscreen) {video.webkitRequestFullscreen();} else if (video.msRequestFullscreen) {video.msRequestFullscreen();}
}
常用属性和方法
| 属性/方法 | 说明 |
|---|---|
currentTime | 当前播放位置(秒) |
duration | 视频总时长(秒) |
paused | 是否暂停 |
ended | 是否播放结束 |
muted | 是否静音 |
volume | 音量(0.0-1.0) |
playbackRate | 播放速率 |
play() | 播放视频 |
pause() | 暂停视频 |
load() | 重新加载视频 |
响应式视频
使视频适应不同屏幕尺寸的几种方法:
方法1:使用百分比宽度
<video controls style="width: 100%; height: auto;"><source src="movie.mp4" type="video/mp4">
</video>
方法2:使用CSS媒体查询
@media (max-width: 768px) {.video-container video {width: 100%;height: auto;}
}@media (min-width: 769px) {.video-container video {width: 640px;height: 360px;}
}
方法3:视频容器
<div class="video-container"><video controls><source src="movie.mp4" type="video/mp4"></video>
</div>
.video-container {position: relative;padding-bottom: 56.25%; /* 16:9的宽高比 */height: 0;overflow: hidden;
}.video-container video {position: absolute;top: 0;left: 0;width: 100%;height: 100%;
}
自定义视频控件
创建自定义控件以替代浏览器默认控件:
<div class="video-player"><video id="customVideo" src="movie.mp4"></video><div class="custom-controls"><button id="playBtn">播放</button><input type="range" id="progressBar" min="0" value="0" step="0.1"><span id="currentTime">00:00</span> / <span id="duration">00:00</span><input type="range" id="volumeControl" min="0" max="1" value="1" step="0.1"><button id="muteBtn">静音</button><button id="fullscreenBtn">全屏</button></div>
</div>
const video = document.getElementById('customVideo');
const playBtn = document.getElementById('playBtn');
const progressBar = document.getElementById('progressBar');
const currentTimeEl = document.getElementById('currentTime');
const durationEl = document.getElementById('duration');
const volumeControl = document.getElementById('volumeControl');
const muteBtn = document.getElementById('muteBtn');
const fullscreenBtn = document.getElementById('fullscreenBtn');// 播放/暂停
playBtn.addEventListener('click', function() {if (video.paused) {video.play();playBtn.textContent = '暂停';} else {video.pause();playBtn.textContent = '播放';}
});// 更新进度条
video.addEventListener('timeupdate', function() {progressBar.value = video.currentTime;currentTimeEl.textContent = formatTime(video.currentTime);
});// 加载元数据后设置进度条最大值和显示时长
video.addEventListener('loadedmetadata', function() {progressBar.max = video.duration;durationEl.textContent = formatTime(video.duration);
});// 使用进度条跳转
progressBar.addEventListener('input', function() {video.currentTime = progressBar.value;
});// 音量控制
volumeControl.addEventListener('input', function() {video.volume = volumeControl.value;
});// 静音切换
muteBtn.addEventListener('click', function() {video.muted = !video.muted;muteBtn.textContent = video.muted ? '取消静音' : '静音';
});// 全屏
fullscreenBtn.addEventListener('click', function() {if (video.requestFullscreen) {video.requestFullscreen();} else if (video.webkitRequestFullscreen) {video.webkitRequestFullscreen();} else if (video.msRequestFullscreen) {video.msRequestFullscreen();}
});// 格式化时间
function formatTime(seconds) {const mins = Math.floor(seconds / 60);const secs = Math.floor(seconds % 60);return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
}
视频字幕和轨道
使用<track>标签为视频添加字幕:
<video controls><source src="movie.mp4" type="video/mp4"><track src="subtitles_zh.vtt" kind="subtitles" srclang="zh" label="中文" default><track src="subtitles_en.vtt" kind="subtitles" srclang="en" label="English">
</video>
WebVTT字幕文件格式
WEBVTT00:00:01.000 --> 00:00:04.000
大家好,欢迎观看本视频。00:00:05.000 --> 00:00:08.000
今天我们将学习HTML5视频标签的使用。
track标签属性
| 属性 | 值 | 说明 |
|---|---|---|
src | URL | 字幕文件URL |
kind | subtitles/captions/descriptions/chapters/metadata | 轨道类型 |
srclang | 语言代码 | 字幕语言 |
label | 文本 | 字幕选择菜单中显示的标签 |
default | default | 默认显示该字幕 |
浏览器兼容性
各主流浏览器对HTML5视频的支持情况:
| 浏览器 | MP4 | WebM | Ogg |
|---|---|---|---|
| Chrome | 4.0+ | 6.0+ | 5.0+ |
| Firefox | 21.0+ | 4.0+ | 3.5+ |
| IE/Edge | 9.0+ | Edge | 不支持 |
| Safari | 3.0+ | 不支持 | 不支持 |
| Opera | 25.0+ | 10.6+ | 10.5+ |
最大兼容性方案
<video controls><source src="movie.mp4" type="video/mp4"><source src="movie.webm" type="video/webm"><source src="movie.ogv" type="video/ogg"><!-- Flash回退 --><object width="320" height="240" type="application/x-shockwave-flash" data="flashplayer.swf"><param name="movie" value="flashplayer.swf" /><param name="flashvars" value="controlbar=over&image=poster.jpg&file=movie.mp4" /><img src="poster.jpg" width="320" height="240" alt="视频封面图" /></object>
</video>
性能优化
1. 使用适当的预加载策略
<!-- 仅加载元数据,减少初始加载时间 -->
<video preload="metadata" controls><source src="movie.mp4" type="video/mp4">
</video>
2. 提供多种分辨率
<video controls><source src="movie-hd.mp4" type="video/mp4" media="(min-width: 1080px)"><source src="movie-sd.mp4" type="video/mp4">
</video>
3. 使用视频分片和流媒体技术
- HLS (HTTP Live Streaming)
- DASH (Dynamic Adaptive Streaming over HTTP)
4. 延迟加载视频
document.addEventListener('DOMContentLoaded', function() {const videoPlaceholder = document.getElementById('videoPlaceholder');const videoContainer = document.getElementById('videoContainer');videoPlaceholder.addEventListener('click', function() {videoContainer.innerHTML = `<video controls autoplay><source src="movie.mp4" type="video/mp4"></video>`;videoPlaceholder.style.display = 'none';});
});
常见问题排查
视频无法播放
检查点:
- 文件路径是否正确
- 视频格式是否被浏览器支持
- 服务器是否设置了正确的MIME类型
- 跨域资源共享(CORS)问题
自动播放不生效
现代浏览器限制自动播放策略:
-
添加
muted属性可以绕过部分限制
<video autoplay muted controls> -
通过用户交互触发播放
document.addEventListener('click', function() { video.play();}, { once: true });
全屏问题
不同浏览器的全屏API:
function openFullscreen(element) {if (element.requestFullscreen) {element.requestFullscreen();} else if (element.webkitRequestFullscreen) { /* Safari */element.webkitRequestFullscreen();} else if (element.msRequestFullscreen) { /* IE11 */element.msRequestFullscreen();} else if (element.mozRequestFullScreen) { /* Firefox */element.mozRequestFullScreen();}
}
实例展示
基础视频播放器
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>HTML5视频播放器</title><style>.video-container {max-width: 800px;margin: 0 auto;}video {width: 100%;height: auto;}</style>
</head>
<body><div class="video-container"><video controls poster="preview.jpg"><source src="movie.mp4" type="video/mp4"><source src="movie.webm" type="video/webm"><p>您的浏览器不支持HTML5视频。请升级浏览器或下载<a href="movie.mp4">视频文件</a>。</p></video></div>
</body>
</html>
高级自定义播放器
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>自定义HTML5视频播放器</title><style>.video-player {max-width: 800px;margin: 0 auto;position: relative;}video {width: 100%;height: auto;display: block;}.custom-controls {position: absolute;bottom: 0;left: 0;right: 0;background: rgba(0, 0, 0, 0.5);color: white;padding: 10px;display: flex;align-items: center;opacity: 0;transition: opacity 0.3s;}.video-player:hover .custom-controls {opacity: 1;}button {background: transparent;border: 1px solid white;color: white;margin: 0 5px;padding: 5px 10px;cursor: pointer;}input[type="range"] {margin: 0 5px;}#progressBar {flex-grow: 1;}</style>
</head>
<body><div class="video-player"><video id="customVideo" poster="preview.jpg"><source src="movie.mp4" type="video/mp4"></video><div class="custom-controls"><button id="playBtn">播放</button><input type="range" id="progressBar" min="0" value="0" step="0.1"><span id="currentTime">00:00</span> / <span id="duration">00:00</span><input type="range" id="volumeControl" min="0" max="1" value="1" step="0.1"><button id="muteBtn">静音</button><button id="fullscreenBtn">全屏</button></div></div><script>const video = document.getElementById('customVideo');const playBtn = document.getElementById('playBtn');const progressBar = document.getElementById('progressBar');const currentTimeEl = document.getElementById('currentTime');const durationEl = document.getElementById('duration');const volumeControl = document.getElementById('volumeControl');const muteBtn = document.getElementById('muteBtn');const fullscreenBtn = document.getElementById('fullscreenBtn');// 播放/暂停playBtn.addEventListener('click', function() {if (video.paused) {video.play();playBtn.textContent = '暂停';} else {video.pause();playBtn.textContent = '播放';}});// 更新进度条video.addEventListener('timeupdate', function() {progressBar.value = video.currentTime;currentTimeEl.textContent = formatTime(video.currentTime);});// 加载元数据后设置进度条最大值和显示时长video.addEventListener('loadedmetadata', function() {progressBar.max = video.duration;durationEl.textContent = formatTime(video.duration);});// 使用进度条跳转progressBar.addEventListener('input', function() {video.currentTime = progressBar.value;});// 音量控制volumeControl.addEventListener('input', function() {video.volume = volumeControl.value;});// 静音切换muteBtn.addEventListener('click', function() {video.muted = !video.muted;muteBtn.textContent = video.muted ? '取消静音' : '静音';});// 全屏fullscreenBtn.addEventListener('click', function() {if (video.requestFullscreen) {video.requestFullscreen();} else if (video.webkitRequestFullscreen) {video.webkitRequestFullscreen();} else if (video.msRequestFullscreen) {video.msRequestFullscreen();}});// 格式化时间function formatTime(seconds) {const mins = Math.floor(seconds / 60);const secs = Math.floor(seconds % 60);return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;}</script>
</body>
</html>
通过本教程,您应该能够掌握HTML5 video标签的各种用法和技巧,从简单的视频嵌入到复杂的自定义播放器开发。希望这些内容对您的Web开发工作有所帮助!
相关文章:
HTML5 Video标签详细教程
HTML5 Video标签详细教程 简介 HTML5引入的<video>标签为网页提供了原生视频播放功能,无需依赖Flash等第三方插件。它使得在网页中嵌入和控制视频内容变得简单而强大。本教程将详细介绍<video>标签的使用方法、属性、事件以及相关技术。 基本用法 最…...
【Hbase】查看所有表
在 HBase 中,查看所有表时,通常不需要指定命名空间,除非有特殊需求或配置。以下是一些具体情况: 默认情况下 • HBase Shell:使用list命令时,默认会列出所有命名空间中的所有表,而不仅仅是默认…...
Java 分布式高并发重试方案及实现
文章目录 Java 分布式高并发重试方案及实现一、重试机制的背景和意义二、基于 Spring Boot 的重试方案实现1. 使用 Spring Retry 实现重试机制添加依赖开启重试功能定义重试逻辑使用重试服务 2. 使用 Fast-Retry 实现高性能重试引入依赖编程式重试注解式重试 三、重试机制的注意…...
Spring Boot 集成 Quartz 实现定时任务(Cron 表达式示例)
Spring Boot 集成 Quartz 实现定时任务(Cron 表达式示例) 前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Spring Boot 观察定时任务执行5. Quartz Cron 表达式详解6. 结论 前言 在 Spring Boot 项目中,我们经常…...
关于“碰一碰发视频”系统的技术开发文档框架
以下是关于“碰一碰发视频”系统的技术开发文档框架,涵盖核心功能、技术选型、开发流程和关键模块设计,帮助您快速搭建一站式解决方案 --- 随着短视频平台的兴起,用户的创作与分享需求日益增长。而如何让视频分享更加便捷、有趣,…...
vue3之写一个aichat---已聊天组件部分功能
渲染聊天数据 这个不必多说,直接从stores/chat中取出聊天列表数据渲染就好,因为前面添加的消息都是按照用户消息、AI助手消息这样添加的,效果如图 但是需要注意每条助手消息的状态,需要根据状态显示不同的图标或不显示图标&…...
ffmpeg+ubuntu编译库(完整版本)
个人使用环境: ubuntu desktop 16.04 + ffmpeg 4.2.1创建目录在home目录下创建 ffmpeg_sources:用于下载源文件 ffmpeg_build: 存储编译后的库文件 bin:存储二进制文件(ffmpeg,ffplay,ffprobe,X264,X265等) mkdir ffmpeg_sources ffmpeg_build bin安装依赖 先执行…...
基于STC89C51的太阳自动跟踪系统的设计与实现—单片机控制步进电机实现太阳跟踪控制(仿真+程序+原理图+PCB+文档)
摘 要 随着我国经济的飞速发展,促使各种能源使用入不敷出,尤其是最主要的能源,煤炭石油资源不断消耗与短缺,因此人类寻找其他替代能源的脚步正在加快。而太阳能则具有无污染﹑可再生﹑储量大等优点,且分布范围广&…...
第五: redis 安装 / find 查找目录
redis 安装的 两种方式: mac上安装redis的两种方法_如何在mac上安装redis-CSDN博客 首先可以先看一下brew的常用命令如下: brew search ** //查找某个软件包 brew list //列出已经安装的软件的包 brew install ** //安装某个软件包,默认安装的是…...
c++--vector
1.定义vector vector的定义分为四种 (1)vector() ——————无参构造 (2)vector(size_t n,const value_type& val value_type()) ——————构造并初始化n个val (3)vector(const vector& v1) ———————拷贝构造 (4)vector(inputiterator first,inpu…...
Springboot 项目如何输出优雅的日志
我们先看效果图: 我个人比较喜欢这种格式的日志输出,对其完整; 这种格式其实就是默认的,不需要大家配置任何的 logback-spring 文件和xml中配置日志level 没有做任何多余的配置;...
Linux——进程(5)进程地址空间
先看一个程序和现象 预期现象是,子进程和父进程相互独立,子进程的gval是100,101,102....而父进程一直都是100. 结果我们并不意外,只是我们发现,父子进程的gval的地址是一样的,这有点颠覆我们的认…...
代码随想录_动态规划
代码随想录 动态规划 509.斐波那契数 509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n…...
c库、POSIX库、C++库、boost库之间的区别和联系
文章目录 一、区别1. 定义和来源2. 功能范围3. 可移植性4. 语言支持5. 维护和更新 二、联系1. 相互补充2. 部分功能重叠3. 共同促进编程发展4. 代码兼容性 三、总结 一、区别 1. 定义和来源 C 库函数:由 ANSI C 和 ISO C 标准定义,是 C 语言编程的基础…...
Maven常见问题汇总
Maven刷新,本地仓库无法更新 现象 This failure was cached in the local repository and resolution is not reattempted until the update interval of aliyunmaven has elapsed or updates are forced原因 因为上一次尝试下载,发现对应的仓库没有这个maven配置…...
星越L_陡坡缓降使用讲解
目录 1.陡坡缓降 1.陡坡缓降 中控屏下滑-点击陡坡缓降功能 35km/h以下时生效。35km/h-60km/h该功能暂停 60km/h以上该功能关闭...
XSS跨站脚本攻击漏洞(Cross Site Scripting)
前提概要 本文章主要用于分享XSS跨站脚本攻击漏洞基础学习,以下是对XSS跨站脚本攻击漏洞的一些个人解析,请大家结合参考其他文章中的相关信息进行归纳和补充。 XSS跨站脚本攻击漏洞描述 跨站脚本攻击(XSS)漏洞是一种常见且危害较…...
html5基于Canvas的经典打砖块游戏开发实践
基于Canvas的经典打砖块游戏开发实践 这里写目录标题 基于Canvas的经典打砖块游戏开发实践项目介绍技术栈核心功能实现1. 游戏初始化2. 游戏对象设计3. 碰撞检测系统4. 动画系统5. 用户界面设计 性能优化1. 渲染优化2. 内存管理 项目亮点技术难点突破项目总结 项目介绍 在这个…...
企业信息化的“双螺旋”——IT治理和数据治理
企业信息化的“双螺旋”——IT治理和数据治理 一、核心定义二、关键差异三、内在联系四、实践挑战与融合路径五、行业案例参考六、结论数据治理(Data Governance)和IT治理(IT Governance)是现代企业数字化转型中的关键概念,二者既有紧密关联又各有侧重。以下从定义、核心内…...
设计模式之工厂模式的优缺点
工厂模式是一种创建对象的设计模式,它将对象的创建和使用分离。以下是工厂模式的优缺点: 优点 - 解耦对象的创建和使用:使得代码的依赖关系更加清晰,使用者不需要了解对象的具体创建过程,只需要关心如何使用对象&a…...
CCBCISCN复盘
AWDP – ccfrum 自己搭了一下环境, 复现一下这道题目, 之前比赛的时候完全没想到这个漏洞要怎么打, 修也不知道要怎么修, 就仅仅是对用户名的账号和密码进行了一下过滤, 完全没起到作用, 唉, 实在太菜 如果想要尝试复现的话可以尝试拉取这个镜像, 我打完之后就直接把这个容器给…...
糊涂人寄信——递推
思路分析:当有n封信,n个信封时。第k封信没有装在第k个信封里(k从1~n),就算所有的信封都装错了。我们可以得知的是,当有1封信,时,装错类别数为0。当有两封信时,装错类别为1。 当有三…...
OpenHarmony子系统开发 - 电源管理(一)
OpenHarmony子系统开发 - 电源管理(一) 一、电源模式定制开发指导 概述 简介 OpenHarmony默认提供了电源模式(如正常模式、性能模式、省电模式、超级省电模式)的特性。但由于不同产品的部件存在差异,导致在同样场景…...
使用 OpenCV 拼接进行图像处理对比:以形态学操作为例
图像处理在计算机视觉中起着至关重要的作用,而 OpenCV 作为一个强大的图像处理库,提供了丰富的函数来实现各类图像处理任务。形态学操作(Morphological Operations)是其中常用的技术,尤其适用于二值图像的处理。常见的…...
数据库的左连接,右连接,全外连接,自连接,内连接的区别
从语法层面上看, 全外连接full outer join 左连接是left outer join 右连接是right outer join 内连接是inner join 自连接是自身表与自身表进行的左右连接,需要注意的是并没有左内连接和右内连接。 左外连接 select * from A left outer join B …...
Nexus L2 L3基本配置
接口基本配置 N7K上所有端口默认处于shutdown状态; N5K上所有端口默认处于no shutdown状态(所有端口都是switchport) 默认所有接口都是三层route模式, 只有当线卡不支持三层的时候, 接口才会处于二层switchport模式 show run all | in “system default” 创建SVI口需要提前打…...
OpenHarmony 入门——ArkUI 跨页面数据同步和页面级UI状态存储LocalStorage小结(二)
文章大纲 引言一、在代码逻辑使用LocalStorage二、从UI内部使用LocalStorage三、LocalStorageProp和LocalStorage单向同步四、LocalStorageLink和LocalStorage双向同步五、兄弟组件之间同步状态变量七、将LocalStorage实例从UIAbility共享到一个或多个视图 引言 前面一篇文章主…...
Python数据可视化实战:从基础图表到高级分析
Python数据可视化实战:从基础图表到高级分析 数据可视化是数据分析的重要环节,通过直观的图表可以快速洞察数据规律。本文将通过5个实际案例,手把手教你使用Python的Matplotlib库完成各类数据可视化任务,涵盖条形图、堆积面积图、…...
在 Elasticsearch 中扩展后期交互模型 - 第 2 部分 - 8.18
作者:来自 Elastic Peter Straer 及 Benjamin Trent 本文探讨了如何优化后期交互向量,以适应大规模生产工作负载,例如减少磁盘空间占用和提高计算效率。 在之前关于 ColPali 的博客中,我们探讨了如何使用 Elasticsearch 创建视觉搜…...
蓝桥每日打卡--区间移位
#蓝桥#JAVA#区间移位 题目描述 数轴上有n个闭区间:D1,⋯Dn。 其中区间Di用一对整数[ai,bi]来描述,满足 ai≤bi。 已知这些区间的长度之和至少有。 所以,通过适当的移动这些区间,你总可以使得他们的"并"覆盖 [0,],也…...
