HTML5 <video> 标签 完整知识点汇总

举报
yd_47669746 发表于 2026/10/27 10:41:24 2026/10/27
【摘要】 <video> HTML 元素用于在文档中嵌入媒体播放器,用于支持文档内的视频播放。你也可以将 <video> 标签用于音频内容,但是 <audio> 元素可能在用户体验上更合适。 一、基础结构与基本使用<video src="movie.mp4" controls width="640" height="360" autoplay muted loop pr...

<video> HTML 元素用于在文档中嵌入媒体播放器,用于支持文档内的视频播放。你也可以将 <video> 标签用于音频内容,但是 <audio> 元素可能在用户体验上更合适。

一、基础结构与基本使用

<video 
  src="movie.mp4" 
  controls 
  width="640" 
  height="360" 
  autoplay 
  muted 
  loop 
  preload="auto" 
  poster="preview.jpg" 
  oncontextmenu="return false"
>
  您的浏览器不支持video标签
</video>

二、常用属性(Attributes)

属性名 说明
src 视频资源路径(建议使用<source>标签代替)
controls 是否显示浏览器默认控件
autoplay 页面加载后自动播放
muted 视频静音播放
loop 播放结束后循环播放
preload 预加载行为:auto(全载) / metadata(仅元数据) / none
poster 视频加载时显示的图片
width/height 视频区域尺寸
playsinline iOS设备上是否在网页中播放(不全屏)
crossorigin 用于CORS请求资源,如 anonymous、use-credentials
disablepictureinpicture 禁用画中画模式
controlslist 控件选项:nodownload, nofullscreen, noremoteplayback
oncontextmenu 禁止右键菜单(常用于保护视频资源)

三、<source> 标签

推荐写法(支持多格式兼容):

<video controls>
  <source src="movie.mp4" type="video/mp4; codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
  <source src="movie.webm" type="video/webm; codecs=&quot;vp8, vorbis&quot;">
  您的浏览器不支持视频标签。
</video>

MIME类型与Codecs常用组合:

格式 MIME Type Codecs 示例
MP4 video/mp4 avc1.42E01E, mp4a.40.2
WebM video/webm vp8, vorbis
Ogg video/ogg theora, vorbis
MOV video/quicktime ——
HLS (.m3u8) application/x-mpegURL(需插件或自定义播放器) h.264 / AAC

四、视频格式兼容性说明

浏览器 MP4 支持 WebM 支持 Ogg 支持 HEVC/H.265 支持(部分) AV1 支持
Chrome ✅ ✅ ✅ ✅(部分支持) ✅
Firefox ❌(受限) ✅ ✅ ❌ ✅
Safari ✅ ✅(部分) ❌ ✅(Mac) ❌(Safari 16+开始支持)
Edge ✅ ✅ ✅ ✅ ✅
Android ✅ ✅ ✅ ✅ ✅
iOS ✅ ❌ ❌ ✅ ❌

👉 建议方案:

  • 提供MP4 + WebM两种格式;
  • iOS平台推荐使用MP4;
  • 需要HEVC支持时,使用Safari专属支持;
  • HLS(.m3u8)建议配合hls.js或videojs-http-streaming(HLS.js)播放器;
  • DASH(.mpd)可使用Shaka Player等解决方案。

五、常用事件(Events)

const video = document.querySelector('video');
video.addEventListener('play', () => { ... });
事件名 说明
loadstart 开始加载视频
progress 视频加载过程
suspend 浏览器停止下载
error 加载或播放错误
emptied 视频突然清空
stalled 浏览器尝试获取数据但失败
loadedmetadata 元数据加载完成
loadeddata 第一帧视频数据已加载
canplay 视频可以开始播放(缓冲足够)
canplaythrough 视频可以流畅播放(缓冲足够)
play 播放被用户或脚本触发
playing 视频正在播放
pause 暂停事件
ended 播放结束
timeupdate 播放进度更新(time属性变化)
volumechange 音量改变
ratechange 播放速率改变
resize 视频区域尺寸变化
seeking / seeked 拖动时间轴事件
durationchange 视频总时长改变

六、错误处理 error.code

error.code 含义
1 用户中止了播放
2 网络错误
3 解码错误
4 没有可支持的资源
video.addEventListener('error', function() {
  let error = video.error;
  switch(error.code) {
    case 1: alert('播放中止'); break;
    case 2: alert('网络错误'); break;
    case 3: alert('播放器发生解码错误'); break;
    case 4: alert('不支持的视频格式'); break;
  }
});

七、JavaScript控制

操作 代码
播放 video.play()
暂停 video.pause()
视频当前时间 video.currentTime = 30; // 跳到30秒
视频音量 video.volume = 0.5; // 0~1
是否静音 video.muted = true;
视频速度 video.playbackRate = 1.5;
视频持续时间 video.duration; // 秒数
当前播放位置 video.currentTime
全屏播放 video.requestFullscreen() / 需考虑兼容性
浏览器全屏模式 document.fullscreenElement
加载视频 video.load() 或设置 src
获取缓冲信息 video.buffered (时间范围对象)

八、自定义控件(Advanced)

  1. 移除controls属性,完全自定义UI
  2. 使用DOM+JS控制视频播放
  3. 示例:带自定义进度条
<video id="customVideo"></video>
<div class="controls">
  <button id="play">Play</button>
  <input type="range" id="progress" min="0" max="100" value="0">
</div>
const video = document.getElementById('customVideo');
const play = document.getElementById('play');
const progress = document.getElementById('progress');

play.onclick = function () {
  if (video.paused) {
    video.play();
    play.textContent = 'Pause';
  } else {
    video.pause();
    play.textContent = 'Play';
  }
};

video.ontimeupdate = function () {
  progress.value = (video.currentTime / video.duration) * 100 || 0;
};

progress.onchange = function () {
  video.currentTime = (progress.value / 100) * video.duration;
};

九、性能优化建议

  • 使用preload="metadata"避免首次加载加载过大视频文件;
  • 使用playsinline防止iOS下自动全屏;
  • 使用CDN、视频压缩、WebM + H.264格式优化;
  • 视频使用响应式布局:max-width: 100%; height: auto;;
  • 检测播放错误并提示用户重试;
  • 对移动端视频建议使用muted和playsinline属性。

十、无障碍支持

  • 使用<track>标签实现字幕、章节提示;
  • 示例:
<video ...>
  <source src="video.mp4">
  <track 
    src="captions_en.vtt" 
    kind="captions" 
    srclang="en" 
    label="English"
    default
  >
</video>

字幕格式 .vtt 示例:

WEBVTT

Hello World

00:00:00.000 --> 00:00:04.000
欢迎观看这段视频演示。

00:00:05.000 --> 00:00:08.000
感谢您的关注!

十一、视频播放策略与浏览器限制(很重要!)

  1. 自动播放限制:
    • 必须静音 (muted)
    • 需要用户交互动作(如 click)
    • autoplay + muted是主流兼容写法
video
  .play()
  .then(() => console.log('视频播放成功'))
  .catch(err => {
    console.warn('自动播放被拦截,请交互后播放');
  });
  1. 全屏播放需用户交互
  2. iOS限制更多,不支持自动播放非静音
  3. 安卓浏览器策略类似PC浏览器

十二、常见问题与解决方案

问题 解决方案
视频不播放 检查 MIME 类型、跨域、路径、格式
自动播放失败 必须加上 muted 属性并监听 canplay 后执行 play
iOS黑屏 添加 playsinline 属性
跨域无法播放 使用 crossorigin="anonymous" 并配置CORS头
视频模糊/拉伸 使用 CSS object-fit: cover
全屏被阻止 检查是否是用户主动触发,或使用 allowfullscreen 属性

以上就是我对HTML5 <video> 标签的完整、详尽、专业级别的知识点整理,共 13 大项、300+知识点和建议,涵盖从基础语法到性能优化、常见问题与解决方案、推荐框架等,适用于从初学者到中高级前端工程师查阅。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。