使用 video 播放视频
预先准备的视频素材(mp4和webm两种格式):
- https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm
- https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4
本文的演示代码会放在 https://github.com/gaollard/vue-viedo 这个库,演示 demo:
- 添加字幕1 http://demo.airtlab.com/video
- 添加字幕2 https://www.zhangxinxu.com/study/201803/video-track-webvtt.html
1. video 介绍
HTML video 元素 用于在HTML或者XHTML文档中嵌入媒体播放器,用于支持文档内的视频播放。你也可以将 video 标签用于音频内容,但是 audio 元素可能在用户体验上更合适。下面是一个简单例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>视频播放</title>
</head>
<body>
<video
controls
src="https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4">
</video>
</body>
</html>
和 img 元素的使用类似,在 src 属性里加入一个我们需要展示的视频地址,同时也可以用其他属性来定义视频的宽度高度、是否自动或者循环播放、是否展示浏览器默认的视频控件等信息。上面的例子中controls用于控制是否展示浏览器默认的视频控件。
在 video
标签中间的内容,是针对浏览器不支持此元素时候的降级处理。浏览器并不是都支持相同的视频格式,所以你可以在 source
元素里提供多个视频源,然后浏览器将会使用它所支持的第一个源。
<video controls>
<source src="myVideo.mp4" type="video/mp4">
<source src="myVideo.webm" type="video/webm">
<p>Your browser doesn't support HTML5 video. Here is
a <a href="myVideo.mp4">link to the video</a> instead.</p>
</video>
2. video 属性
1. autoplay(自动播放)
如果这个bool数值被指定了autoplay,视频就会开始自动播放,而且无需停止加载任何数据。
这个属性在苹果手机上无效(从体验的角度出发,确实应该禁用)
2. controls(展示操作控件)
加上这个属性,展示浏览器默认的视频控件,允许用户控制视频的播放,包括音量,跨帧,暂停/恢复播放等功能。
3. poster(海报)
一个海报帧的URL,用于在用户播放或者跳帧之前展示。如果属性未指定,那么在第一帧可用之前什么都不会展示;之后第一帧就像海报帧一样展示。另外您可以使用其他HTML控件,来模拟这个功能。
4. src(视频地址)
要嵌到页面的视频的URL。可选;你也可以使用 video
块内的 source
元素来指定需要嵌到页面的视频。
3. video 事件和方法
1. 事件
在处理用 audio 和 video 标签嵌入到HTML文档中的媒体时,会触发多种事件,直接查看 mdn 文档:媒体相关事件。
事件名称 | 描述 |
---|---|
abort |
在播放被终止时触发,例如, 当播放中的视频重新开始播放时会触发这个事件。 |
canplay |
在媒体数据已经有足够的数据(至少播放数帧)可供播放时触发。这个事件对应CAN_PLAY的readyState。 |
canplaythrough |
在媒体的readyState变为CAN_PLAY_THROUGH时触发,表明媒体可以在保持当前的下载速度的情况下不被中断地播放完毕。注意:手动设置currentTime会使得firefox触发一次canplaythrough事件,其他浏览器或许不会如此。 |
durationchange |
元信息已载入或已改变,表明媒体的长度发生了改变。例如,在媒体已被加载足够的长度从而得知总长度时会触发这个事件。 |
emptied |
媒体被清空(初始化)时触发。 |
ended |
播放结束时触发。 |
error |
在发生错误时触发。元素的error属性会包含更多信息。参阅 HTMLMediaElement.error 获得详细信息。 |
interruptbegin |
声音在Firefox OS设备中断时触发,可能是应用程序被切换至后台或者更高优先级的应用占用了音频通道。 相关信息请参考 Using the AudioChannels API |
interruptend |
声音在Firefox OS设备中断后恢复播放时触发,应用程序被切换至前台或占用更高级音频通道的应用程序播放完毕后触发。相关信息请参考 Using the AudioChannels API |
loadedmetadata |
媒体的元数据已经加载完毕,现在所有的属性包含了它们应有的有效信息。 |
loadstart |
在媒体开始加载时触发。 |
mozaudioavailable |
当音频数据缓存并交给音频层处理时 |
pause |
播放暂停时触发。 |
play |
在媒体回放被暂停后再次开始时触发。即,在一次暂停事件后恢复媒体回放。 |
playing |
在媒体开始播放时触发(不论是初次播放、在暂停后恢复、或是在结束后重新开始)。 |
progress |
告知媒体相关部分的下载进度时周期性地触发。有关媒体当前已下载总计的信息可以在元素的buffered属性中获取到。 |
ratechange |
在回放速率变化时触发。 |
seeked |
在跳跃操作完成时触发。 |
seeking |
在跳跃操作开始时触发。 |
stalled |
在尝试获取媒体数据,但数据不可用时触发。 |
suspend |
在媒体资源加载终止时触发,这可能是因为下载已完成或因为其他原因暂停。 |
timeupdate |
元素的currentTime属性表示的时间已经改变。 |
volumechange |
在音频音量改变时触发(既可以是volume属性改变,也可以是muted属性改变).。 |
waiting |
在一个待执行的操作(如回放)因等待另一个操作(如跳跃或下载)被延迟时触发。 |
2. 方法
事件名称 | 描述 |
---|---|
play |
开始播放 |
pause |
停止播放 |
4. 注意事项
1. 注意事项
- 如果你没有指定 controls 属性,那么视频不会展示浏览器自带的控件,你也可以用 JavaScript 和HTMLMediaElement API 来创建你自己的控件。详情请见 Creating a cross-browser video player。
- 你可以用CSS 属性 object-position 来调整视频在元素内部的位置,它可以控制视频尺寸适应于元素外框的方式。
- 如果想在视频里展示字幕或者标题,你可以在
track
元素和 WebVTT 格式的基础上使用 JavaScript 来实现。详情请见 Adding captions and subtitles to HTML5 video。
此外这里还有一份很棒的关于“视频和音频内容”的初学者材料,这里包含了很多有用的例子,比如音轨文本等等。
2. 自定义控件指南
播放控件主要考虑以下功能:
- 开始/停止/恢复 播放
- 改变播放进度
- 播放进度条
- 播放速度控制(1倍/2倍等)
- 音量控制
- 全屏控制
- 播放前/播放中/暂停状态/完成状态 播放器 poster 的改变
3. 优酷网页播放器分析
优酷网页播放器中,操作控件是自定义的,包含功能和上述基本一致,如下所示:
5. 使用字幕
1. WebVTT 字幕文件
**关于 **WebVTT字幕格式 的相关介绍,请看这里 https://w3c.github.io/webvtt,使用 webvtt 非常简单,搭配 track 标签即可,一个在线的demo: http://demo.airtlab.com/video,或者参考 大神张鑫旭 demo。
千万记住:track 标签在 localhost 域名,或者 file 协议下不展示(一度搞得我怀疑人生)
2. srt 字幕文件
这是另外一中字幕文件格式,但是 video track 不支持,但是可以将 srt 文件按照一定规则转为 vtt 文件,比如借助 ffmpeg:
$ ffmpeg -i *.vtt *.srt
6. 参考文章
- MDN web 中的音频和视频
- MDN 媒体相关事件
- MDN Creating a cross-browser video player
- 玩转HTML5 Video视频WebVTT字幕使用样式与制作 https://www.mobibrw.com/2019/19678