真正透明的视频需WebM+VP8/VP9编码且含Alpha通道,Chrome/Firefox支持;Safari支持极差,MP4/MOV不适用;CSS方案仅模拟透明,Canvas合成可控但性能开销大。
本身不支持透明背景直接给 元素加 background: transparent 或 opacity: 0.5,只会让整个视频(画面+控件)变淡,无法实现「视频内容带 Alpha 通道、背景透出下层元素」的效果。真正能透明的,是视频文件本身——必须是带 Alpha 通道的编码格式,且浏览器需支持解码。
MP4(H.264)不支持 Alpha 通道;MOV(ProRes)虽支持,但浏览器几乎不解析。目前唯一广泛可用的方案是 WebM 容器封装的 VP8 或 VP9 视频,并在编码时启用 Alpha(如用 ffmpeg 的 -vf "format=rgba" 和 -c:v libvpx-vp9 -lossless 1 -pix_fmt yuva420p)。
ffmpeg -i input.mov -vf "format=rgba" -c:v libvpx-vp9 -lossless 1 -pix_fmt yuva420p -c:a copy output.webm 直接播放,背景会自然透出(前提是父容器无遮挡色)mix-blend-mode 和 isolation 不能让视频变透明,但可模拟局部透底效果如果只是想让视频某区域“看起来”透明(比如抠掉纯色背景),mix-blend-mode: difference 或 exclusion 配合纯色背景可能产生错觉,但不可靠、易偏色、不适用于复杂场景。更实用的是用 CSS mask-image 或 clip-path 配合 SVG 遮罩做硬裁切,但这属于「隐藏」而非「Alpha 透明」。
video {
mask-image: url("mask.svg#hole");
mask-size: cover;
}
注意:mask-image 在 Safari 中需加 -webkit- 前缀,且对视频帧率有轻微影响。
把视频帧逐帧读入 ,用 ctx.drawImage(video, ...) 绘制,再通过 ctx.getImageData() 手动处理 Alpha 值(例如按 RGB 阈值抠绿幕)。这能完全控制透明逻辑,但每秒 30 帧全量像素操作极易触发主线程卡顿,必须配合 requestIdleCallback 或 Web Worker 搬运计算。
真正要用,得接受:要么只在小尺寸/低帧率下运行,要么放弃 Safari 支持(其 getImageData 在跨域视频上被严格限制)。
文件带 Alpha、浏览器解码器认得它、并且你没在 Safari 里上线。其他所有“技巧”,都是妥协或错觉。