如何添加视频
让 <video> 元素指向一个视频文件,并加上 controls,读者就能播放它:
<video src="movie.mp4" controls width="640"></video>
controls 会显示浏览器自带的播放器:播放和暂停、进度条、音量和全屏。没有它,视频就只是静静地待在那里。这个预览无法加载视频文件,所以本页的示例用脚本绘制的一小段 canvas 动画作为视频来源;这些属性的效果和使用文件时完全一样:
因为来源是实时视频流而不是文件,这里的进度条无法拖动,也没有固定时长。换成真实的 .mp4,同一个播放器就会有完整的进度条。
video 属性
| 属性 | 作用 |
|---|---|
controls | 显示浏览器的播放器控件 |
autoplay | 能播放时立即开始播放(实际上只在 muted 时有效) |
muted | 开始时静音 |
loop | 播放结束后从头重新播放 |
playsinline | 在 iPhone 上于页面内播放,而不是切换到全屏 |
poster="thumb.jpg" | 视频播放前显示的图片 |
preload | none、metadata(只加载尺寸和时长)或 auto(由浏览器决定下载多少) |
width, height | 以像素为单位的尺寸;两个都设置时,会在视频加载前预留空间 |
autoplay、muted 与 loop
浏览器会阻止带声音自动开始播放的视频。静音的视频可以自动播放,背景视频和循环短片就是这样实现的:
这四个属性要一起使用:autoplay 负责开始播放,muted 让浏览器允许播放,loop 用于循环短片,playsinline 防止 iPhone 以全屏打开。带声音的自动播放视频不仅会被阻止,对屏幕阅读器用户来说也是个问题,因为朗读的声音会被盖过。如果一段视频播放超过五秒,要给用户提供暂停的方法。
封面图与 preload
poster 在视频播放前显示一张图片,就像缩略图。这里的视频完全没有来源,所以只能看到封面图:
设置 preload="none" 时,读者按下播放前浏览器什么都不下载,封面图则让这块区域不至于显得空荡荡。如果想在播放前显示时长,就用 preload="metadata"。没有封面图时,大多数浏览器会在加载出第一帧后显示它。
用 source 提供格式和备用方案
除了 src,你还可以用 <source> 元素列出多个文件。浏览器会播放它支持的第一个:
<video controls width="640" poster="thumb.jpg">
<source src="movie.webm" type="video/webm">
<source src="movie.mp4" type="video/mp4">
<track kind="captions" src="captions.vtt" srclang="en" label="English">
<p>Your browser cannot play this video. <a href="movie.mp4">Download it</a>.</p>
</video>
H.264 编码的 MP4 能在当前所有浏览器中播放,所以只有一个文件时它是稳妥的选择。type 属性让浏览器不必下载就能跳过它无法播放的格式。末尾的文字只会在完全不支持 <video> 的浏览器中显示。
用 track 添加字幕
<track kind="captions"> 加载一个 WebVTT 文件,也就是一个按时间排列文字行的纯文本文件。浏览器会在控件中添加字幕按钮,并在视频上方绘制文字:
WEBVTT
00:00:00.000 --> 00:00:03.000
Welcome to the course.
00:00:03.000 --> 00:00:06.500
Today we build our first web page.
字幕能帮助聋人和听障观众、关掉声音观看的人,以及用第二语言看视频的人。给 track 加上 default,无需点击就会显示字幕。来自其他域名的字幕文件需要 CORS 响应头,并在 video 上加 crossorigin。
设置样式并用 JavaScript 控制
视频和图片一样是替换元素:width: 100% 加上 height: auto 就能让它响应式缩放,object-fit 决定它如何填满形状不同的框。JavaScript 可以使用 play()、pause()、currentTime、volume,以及 play、pause 和 ended 等事件:
play() 会返回一个 promise,当浏览器阻止播放时(例如未静音的自动播放)它会被拒绝,所以正式代码应该用 catch 处理它。自己做控件不是必需的;内置的 controls 支持键盘操作且已本地化,自定义按钮必须把这些都重新实现。对于托管在 YouTube 或 Vimeo 上的视频,则改用 iframe 嵌入它们的播放器。
常见错误
- 使用 autoplay 却没有
muted。 浏览器会阻止它。加上muted和playsinline。 - 忘了
controls。 除非你自己做控件,否则读者没有办法开始播放视频。 - 没有
width和height。 视频加载时页面会跳动。两个都设置,再用 CSS 缩放。 - 文件过大。 为网页压缩视频,页面下方的视频使用
preload="none"或"metadata"。 - 有人声的视频没有字幕。 加一个
<track kind="captions">。
常见问题
HTML 中如何添加视频?
使用 <video src="movie.mp4" controls width="640"></video>。controls 属性会显示浏览器的播放按钮、进度条和音量。没有它,视频只显示第一帧(或封面图),用户无法开始播放。
为什么我的视频 autoplay 不生效?
浏览器会阻止带声音的自动播放。在 autoplay 旁边加上 muted,再加上 playsinline,让 iPhone 在页面内播放而不是全屏:<video autoplay muted loop playsinline>。
网页视频应该用什么格式?
H.264 编码的 MP4 能在当前所有浏览器中播放,所以它是稳妥的默认选择。你可以用 <source> 先列出一个更小的 WebM 文件,让浏览器选择它支持的第一种格式。
如何给视频添加封面图?
使用 poster 属性并填入图片 URL:<video poster="thumb.jpg" controls>。在视频开始播放之前,会一直显示这张图片。
如何给 HTML 视频添加字幕?
在 video 里面加一个 <track kind="captions" src="captions.vtt" srclang="en" label="English">。字幕文件使用 WebVTT 格式,浏览器会在控件中显示一个字幕按钮。
如何让视频自适应屏幕?
在 CSS 中设置 width: 100% 和 height: auto(或 max-width: 100%)。视频会随容器缩放,并保持宽高比。