Menu

HTML video 标签:controls、autoplay、poster 与字幕

<video> 元素用浏览器自带的播放器播放视频文件。学习它的写法、重要的属性(controls、autoplay、muted、loop、playsinline、poster、preload)、用 <source> 提供备用格式、用 <track> 添加字幕、响应式尺寸,以及用 JavaScript 控制播放。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

如何添加视频

让 <video> 元素指向一个视频文件,并加上 controls,读者就能播放它:

<video src="movie.mp4" controls width="640"></video>

controls 会显示浏览器自带的播放器:播放和暂停、进度条、音量和全屏。没有它,视频就只是静静地待在那里。这个预览无法加载视频文件,所以本页的示例用脚本绘制的一小段 canvas 动画作为视频来源;这些属性的效果和使用文件时完全一样:

因为来源是实时视频流而不是文件,这里的进度条无法拖动,也没有固定时长。换成真实的 .mp4,同一个播放器就会有完整的进度条。

video 属性

属性作用
controls显示浏览器的播放器控件
autoplay能播放时立即开始播放(实际上只在 muted 时有效)
muted开始时静音
loop播放结束后从头重新播放
playsinline在 iPhone 上于页面内播放,而不是切换到全屏
poster="thumb.jpg"视频播放前显示的图片
preloadnone、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%)。视频会随容器缩放,并保持宽高比。

Coddy 编程语言插图

和 Coddy 一起学编程

开始