惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Hacker News
The Hacker News
C
Cisco Blogs
P
Privacy & Cybersecurity Law Blog
Cloudbric
Cloudbric
S
Security Affairs
PCI Perspectives
PCI Perspectives
The Last Watchdog
The Last Watchdog
AWS News Blog
AWS News Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
N
News and Events Feed by Topic
W
WeLiveSecurity
T
Tenable Blog
L
LINUX DO - 最新话题
T
Tor Project blog
Help Net Security
Help Net Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
P
Proofpoint News Feed
爱范儿
爱范儿
O
OpenAI News
Hacker News - Newest:
Hacker News - Newest: "LLM"
Y
Y Combinator Blog
I
Intezer
C
Check Point Blog
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
Google DeepMind News
Google DeepMind News
S
Securelist
P
Privacy International News Feed
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V
Vulnerabilities – Threatpost
Schneier on Security
Schneier on Security
量子位
SecWiki News
SecWiki News
L
Lohrmann on Cybersecurity
T
Threat Research - Cisco Blogs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
M
MIT News - Artificial intelligence
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Scott Helme
Scott Helme
H
Help Net Security
Vercel News
Vercel News
云风的 BLOG
云风的 BLOG
Spread Privacy
Spread Privacy
Know Your Adversary
Know Your Adversary
I
InfoQ
TaoSecurity Blog
TaoSecurity Blog
Blog — PlanetScale
Blog — PlanetScale
N
News | PayPal Newsroom
小众软件
小众软件
C
CERT Recently Published Vulnerability Notes

竹林里有冰的博客

Nuxt SSG 博客的尾斜杠到底怎么加? | 竹林里有冰的博客 小米 Xiaomi Book Pro 14 (Ultra X7) Linux 兼容性实测 | 竹林里有冰的博客 国内(大陆)版小米 FCM 熄屏断连:Rootless 环境下的尝试与可能的解决方案 | 竹林里有冰的博客 我没法访问 dl.google.com —— 记一次 TUN 下的网络 debug | 竹林里有冰的博客 Vercel 的缓存控制,你注意过吗? | 竹林里有冰的博客 小记 —— Caddy 在 Layer 4 上的流量代理实践 | 竹林里有冰的博客 你的域名后缀拖慢你的网站速度了嘛?——再谈 DNS 冷启动 | 竹林里有冰的博客 DNS 冷启动:小型站点的“西西弗斯之石” | 竹林里有冰的博客 HTTP/2 Server Push 已事实性“死亡”,我很怀念它 | 竹林里有冰的博客 Nuxt Content v3 中数组字段的筛选困境与性能优化 | 竹林里有冰的博客 后 OCSP 时代,浏览器如何应对证书吊销新挑战 | 竹林里有冰的博客 初试 Github Action Self-hosted Runner,想说爱你不容易 | 竹林里有冰的博客 DNS 解析延迟毁了我的图床优化 | 竹林里有冰的博客 Vue Markdown 渲染优化实战(下):告别 DOM 操作,拥抱 AST 与函数式渲染 | 竹林里有冰的博客 Vue Markdown 渲染优化实战(上):从暴力刷新、分块更新到 Morphdom 的华丽变身 | 竹林里有冰的博客 node-sass 迁移至 dart-sass 踩坑实录 | 竹林里有冰的博客 前端中的量子力学——一打开 F12 就消失的 Bug | 竹林里有冰的博客 el-image 和 el-table 怎么就打架了?Stacking Context 是什么? | 竹林里有冰的博客 2025年,前端如何使用 JS 将文本复制到剪切板? | 竹林里有冰的博客 ssh 拯救世界——通过 ssh 隧道在内网服务器执行 APT 更新 | 竹林里有冰的博客 Cudy TR3000 吃鹅(daed)记 | 竹林里有冰的博客 使用 Cloudflare Workers 监控 Fedora Copr 构建状态 | 竹林里有冰的博客 基于 Cloudflare Workers 实现的在线服务状态检测告警系统 | 竹林里有冰的博客 构建部署在 Cloudflare Workers 上的 TG Bot | 竹林里有冰的博客 2024年,Firefox 是唯一还在坚持执行在线的 SSL 证书吊销状态检查的主流浏览器 | 竹林里有冰的博客 小爱课程表适配不完全指北——以 ZJUT 本科正方教务系统为例 | 竹林里有冰的博客 将博客从 waline v2 更新到 waline v3 | 竹林里有冰的博客 给家里云装上 Fedora 41 KDE 后,我是如何配置的 | 竹林里有冰的博客 为 Hexo 添加 follow 认证 | 竹林里有冰的博客 使用 GPT 对 waline 的评论进行审查 | 竹林里有冰的博客 基于 JavaScript 的 Hexo Fluid 主题 banner 随机背景图实现 | 竹林里有冰的博客 使用向日葵智能插座 C2 用电记录推算宿舍上次烧水时间 | 竹林里有冰的博客 使用 Caddy 反向代理 dockerhub 需要几步? | 竹林里有冰的博客 将 Rustdesk 中继服务从 Arch Linux 迁移至 Debian | 竹林里有冰的博客 自建图床小记五——费用 | 竹林里有冰的博客 自建图床小记四——上传脚本编写与图片迁移 | 竹林里有冰的博客 自建图床小记三—— SSL 证书的自动更新与部署 | 竹林里有冰的博客 自建图床小记二——使用 Workers 为 R2 构建 Restful API | 竹林里有冰的博客 自建图床小记一——图床架构与 DNS 解析 | 竹林里有冰的博客 在 Linux 下使用 mitmproxy 抓取安卓手机上的 HTTPS 流量 | 竹林里有冰的博客 为中柏 N100 小主机开启来电自启 | 竹林里有冰的博客 我的博客被完整地反向代理,并自动翻译成了繁体中文 | 竹林里有冰的博客 尝试体验 Fedora COPR 中的 allow SSH 功能 | 竹林里有冰的博客 在 Arch Linux 下配置使用 HP Laser 103w 打印机无线打印 | 竹林里有冰的博客 使用动态公网 ip + ddns 实现 rustdesk 的 ip 直连 | 竹林里有冰的博客 使用 Windows 虚拟机运行虚拟专用网客户端为 Linux 提供内网环境 | 竹林里有冰的博客 以 Archlinux 中 makepkg 的方式打开 rpmbuild | 竹林里有冰的博客 使用 Github Action 更新用于 rpm 打包的 spec 文件 | 竹林里有冰的博客 使用 Python 生成甘特图(Gantt Chart) | 竹林里有冰的博客 uniapp 中的图片预加载 | 竹林里有冰的博客 小记 - 尝试拼凑出 apt 仓库中的 deb 包下载地址 | 竹林里有冰的博客 在 Linux 下使用 mitmproxy 抓取 HTTPS 流量 | 竹林里有冰的博客 如何使用 docker 部署 onemanager | 竹林里有冰的博客 crontab 中简单的@语法糖 | 竹林里有冰的博客 备份 umami 数据库,并使用 TG Bot 保存 dump 文件 | 竹林里有冰的博客 在 JavaScript 中,箭头函数中的 this 指针到底指向哪里? | 竹林里有冰的博客 结合 Vue.js 与 php 完成的 web 期末大作业,讲讲前后端分离站点开发与部署中可能遇到的 CORS 跨域问题 | 竹林里有冰的博客 vuejs、php、caddy 与 docker —— web 期末大作业上云部署 | 竹林里有冰的博客 【翻译】使用 PHP 构建简单的 REST API | 竹林里有冰的博客 在 Hexo Fluid 主题中使用霞鹜文楷 | 竹林里有冰的博客 【翻译】GLWTPL——祝你好运开源许可证 | 竹林里有冰的博客 通过巴法云将向日葵智能插座接入米家,实现小爱同学远程控制 | 竹林里有冰的博客 使用 Root 后的安卓手机获取向日葵智能插座 C2 的开关 api | 竹林里有冰的博客 创建 b23.tv 追踪参数移除 bot | 竹林里有冰的博客 jinja2 中如何优雅地实现换行 | 竹林里有冰的博客 手动指定 python-selenium 的 driver path 以解决在中国大陆网络环境下启动卡住的问题 | 竹林里有冰的博客 从零开始的静态网页部署(到个人云服务器) | 竹林里有冰的博客 在运行OpenWRT的N1盒子上部署 QQBot | 竹林里有冰的博客 在浙工大宿舍使用路由器连接移动网络(校园网) | 竹林里有冰的博客 为红米 Redmi AC2100 路由器刷入 Padavan | 竹林里有冰的博客 Azure 教育订阅申请时遇到的麻烦 | 竹林里有冰的博客 执行 repo sync 后将 git-lfs 中的资源文件 checkout | 竹林里有冰的博客 隐式转发——骚套路建站方案 | 竹林里有冰的博客 在 vps 上配合 caddy 部署 siteproxy | 竹林里有冰的博客 onedrive(by abraunegg) —— 一个 Linux 下的开源 OneDrive 客户端(cli) | 竹林里有冰的博客 【翻译】关于2022年11月的事件的一些话[Z-Library] | 竹林里有冰的博客 【已过期】使用 vercel+supabase 免费部署 umami | 竹林里有冰的博客 我的博客部署方案 | 竹林里有冰的博客 使用 VirtScreen 将 Pad 作为副屏 | 竹林里有冰的博客 在 Archlinux 下使用 l2tp 协议连接校园网 | 竹林里有冰的博客 为 Element 添加自己喜欢的贴纸 | 竹林里有冰的博客 nodejs16:是我配不上 openssl 3 咯? | 竹林里有冰的博客 如何拯救失声的 hollywood | 竹林里有冰的博客 处理 fcitx5 的文字候选框在 tg 客户端上闪烁的问题 | 竹林里有冰的博客 使用caddy反向代理维基百科中文站点 | 竹林里有冰的博客 创建一个本地的 Fedora 镜像源 | 竹林里有冰的博客 好软推荐——FastOCR | 竹林里有冰的博客 抛弃PicGo,直接使用curl将图片上传到LskyPro | 竹林里有冰的博客 使用 Github Action 跑 rpmbuild | 竹林里有冰的博客 如何打出一个「-git」的rpm包 | 竹林里有冰的博客 雪藏在开源镜像站点中的那些常用却不为人知的软件 | 竹林里有冰的博客 在Fedora搭建jekyll环境——dnf module | 竹林里有冰的博客 pacman更新时遇到「GPGME 错误:无数据」 | 竹林里有冰的博客 PicUploader使用系列(二)——为KDE的dolphin添加右键快捷菜单 | 竹林里有冰的博客 PicUploader使用系列(一)——在Archlinux上使用Caddy部署PicUploader | 竹林里有冰的博客 使用AUR(Helper)安装软件时究竟发生了什么?对于常见的构建错误如何解决? | 竹林里有冰的博客 下载一份openharmony的源码 | 竹林里有冰的博客 在Windows与Linux双系统下共享蓝牙鼠标 | 竹林里有冰的博客 我在Archlinux上的常用软件 | 竹林里有冰的博客 安卓解包笔记 | 竹林里有冰的博客
2025 年,如何为 web 页面上展示的视频选择合适的压缩算法? | 竹林里有冰的博客
竹林里有冰 · 2025-06-02 · via 竹林里有冰的博客

事情的起因是需要在网页上展示一个时长约为 5 分钟的产品展示视频,拿到的 H264 编码的原文件有 60MB 大。高达 1646 Kbps 码率的视频文件通过网络传输,烧 cdn 流量费用不说,对于弱网环境下的用户体验也绝对不会好。因此必须在兼顾浏览器兼容性(太好了不用管 IE)的情况下,使用更现代的视频压缩算法进行压缩。

哪些压缩算法是目前的主流?#

AV1#

AV1 作为目前压缩效率最高的主流视频编码格式,在 2025 年的今天已经在 YouTube、Netflix、Bilibili 等视频网站全面铺开,毫无疑问是最值得优先考虑的选择;除了优异的压缩效率以外,AV1 免版税的优势使得各硬件厂商和浏览器内核开发者可以无所顾忌的将 AV1 编码的支持添加到自己的产品中。

可惜的是,Safari 并没有对 AV1 编码添加软解支持,只有在搭载 Apple M3 及后续生产的 Mac 和 iPhone 15 Pro 后续的机型才拥有硬解 AV1 的能力,在此之前生产的产品均无法使用 Safari 播放 AV1 编码的视频。我宣布 Safari 已经成为当代 IE,妥妥阻碍 Web 发展的绊脚石

Safari 在搭载 M2Pro 处理器的 Macbook Pro 上直接罢工了Safari 在搭载 M2Pro 处理器的 Macbook Pro 上直接罢工了

除此之外,AV1 在压制视频时对设备的要求较高。在桌面端的消费级显卡中,目前只有 NVIDIA RTX 40 系、AMD Radeon RX 7000 系、IntelArc A380 及后续的产品拥有 AV1 的编码(encode)支持。而 Apple M 系列芯片至今没有任何一款产品拥有对 AV1 编码的硬件支持。这也导致我在我搭载 Intel Core i7-1165G7 的 ThinkPad 上使用 AV1 编码压缩视频时被迫使用 libaom-av1 进行软件编码,1080p 的视频压缩效率为 0.0025x 的速率,五分钟的视频要压一天多的时间。

H.265 / HEVC#

作为 H.264 / AVC 的下一代继任者,H.265(又称 HEVC)的表现可谓是一手好牌打得稀巴烂。HEVC 由多个专利池(如 MPEG LA、HEVC Advance 和 Velos Media)管理,授权费用高且分散,昂贵的专利授权费用严重限制了它的普及速度和范围,尤其是在开放生态和网页端应用中。

Chromium / Firefox 不愿意当承担专利授权费的冤大头,拒绝在当今世界最大的两个开源浏览器内核中添加默认的 H.265 软解支持,目前主流浏览器普遍采用能硬解就硬解,硬解不了就摆烂的支持策略。Firefox on Linux 倒是另辟蹊径,不仅会尝试使用硬解,还会尝试使用用户在电脑上装的 ffmpeg 软解曲线救国。不过好在毕竟是 2013 年就确定的标准,现在大部分硬件厂商都集体被摁着脖子交了专利授权费以保证产品竞争力,Apple 更是 HEVC 的一等公民,保证了全系产品的 HEVC 解码能力。

目前未覆盖到的场景主要是 Chromium / Firefox on Windows 7 和 Chromium on Linux(包括 UOS、麒麟等一众国产 Linux 发行版)。

在 Linux 上不支持硬解 H.265 的 Chrome 直接把视频当作音频播放了在 Linux 上不支持硬解 H.265 的 Chrome 直接把视频当作音频播放了

VP9#

VP9 是 Google 于 2013 年推出的视频编码格式,作为 H.264 的继任者之一,在压缩效率上接近 H.265(HEVC),但最大的杀手锏是——彻底免专利费。这也让 VP9 成为 Google 对 HEVC 高额授权费用的掀桌式回应:你们慢慢吃,我开一桌免费的。

借着免专利的东风和 Google 自家产品矩阵的强推,VP9 在 YouTube、WebRTC 乃至 Chrome 浏览器中迅速站稳了脚跟。特别是在 AV1 普及之前,VP9 几乎是网页视频播放领域的事实标准,甚至逼得苹果这个“编解码俱乐部元老”在 macOS 11 Big Sur 和 iOS 14 上的 Safari 破天荒地加入了 VP9 支持(尽管 VP9 in webm 的支持稍晚一些,具体见上表)。

VP9 的软解码支持基本无死角:Chromium、Firefox、Edge 都原生支持,Safari 也一反常态地“从了”。硬件解码方面,从 Intel Skylake(第六代酷睿)开始,NVIDIA GTX 950 及以上、AMD Vega 和 RDNA 系显卡基本都具备完整的 VP9 解码能力——总之,只要不是博物馆级别的老电脑,就能愉快播放 VP9 视频。

当然,编码仍是 VP9 的短板。Google 官方提供的开源实现 libvpx,速度比不上 x264/x265 等老牌选手,在缺乏硬件加速的场景下,仍然属于“关机前压一宿”的那种体验。不过相比 AV1 的 libaom-av1,VP9 至少还能算“可用”,适合轻量化应用、实时通信或是对压制速度敏感的用户,而早在 7 代 Intel 的 Kaby Lake 系列产品就已经引入了 VP9 的硬件编码支持,各家硬件厂商对 VP9 硬件编码的支持发展到今天还算不错。

H.264 / AVC#

作为“老将出马一个顶俩”的代表,H.264 / AVC 无疑是过去二十年视频编码领域的霸主。自 2003 年标准确定以来,凭借良好的压缩效率、广泛的硬件支持和相对合理的专利授权策略,H.264 迅速成为从网络视频、蓝光光盘到直播、监控乃至手机录像的默认选择。如果你打开一个视频网站的视频流、下载一个在线视频、剪辑一个 vlog,大概率都绕不开 H.264 的身影。

H.264 的最大优势在于——兼容性无敌。不夸张地说,只要是带屏幕的设备,就能播放 H.264 视频。软解?早在十几年前的浏览器和媒体播放器中就已普及;硬解?从 Intel Sandy Bridge、NVIDIA Fermi、AMD VLIW4 这些“史前”架构开始就已加入对 H.264 的完整支持——你甚至可以在树莓派、智能冰箱上流畅播放 H.264 视频。

虽然 H.264 同样存在和 H.265 相同的专利问题,但其授权策略明显更温和——MPEG LA 提供的专利池授权门槛较低,且不向免费网络视频收取费用,使得包括 Chromium、Firefox 在内的浏览器都默认集成了 H.264 的软解功能。Apple 和 Microsoft 更是早早将其作为视频编码和解码的第一公民,Safari 和 Edge 天生支持 H.264,不存在任何兼容性烦恼。

当然,作为一项 20 多年前的技术,H.264 在压缩效率上已经明显落后于 VP9、HEVC 和 AV1。相同画质下,H.264 的码率要比 AV1 高出 30~50%,在追求极致带宽利用或存储节省的应用场景中就显得有些力不从心。然而在今天这个“能播比好看更重要”的现实环境中,H.264 依然是默认方案,是“稳健老哥”的代名词。

所以,即便 AV1、HEVC、VP9 各有亮点,H.264 依旧凭借“老、稳、全”三大核心竞争力,在 2025 年依然牢牢占据着视频生态链的中枢地位——只要这个世界还有浏览器不支持 AV1(可恶的 Safari 不支持软解),服务器不想烧钱转码视频,或用户设备太老,H.264 就不会退场。

小结#

在视频编码方面,浏览器不再是那个能靠一己之力抹平硬件和系统差异的超人,所以总有一些特殊情况是表格中无法涵盖的。

编解码器压缩效率浏览器桌面端支持移动端支持备注
AV1★★★Chrome / Chromium是 (v70+,发布于 2018 年 10 月)是 (v70+,发布于 2018 年 10 月)硬解优先,软解后备
Firefox是 (v67+,发布于 2019 年 5 月)是 (v113+,发布于 2023 年 5 月)硬解优先,软解后备
Safari不完全支持 (仅近两年的产品支持)不完全支持 (仅近两年的产品支持)仅支持硬解 (M3, A17 Pro 系芯片后开始支持),无软解支持
HEVC (H.265)★★☆Chrome / Chromium不完全支持不完全支持仅支持硬解,无软解支持(Windows 可从微软商店安装付费的软解插件)
Firefox不完全支持不完全支持仅支持硬解,无软解支持(Linux 可依赖系统 ffmpeg 实现软解)
Safari近期设备全部支持 (macOS High Sierra+,发布于 2017 年 6 月)近期设备全部支持 (iOS 11+,发布于 2017 年 10 月)苹果是 H.265 一等公民
VP9★★☆Chrome / Chromium支持良好
Firefox支持良好
Safari是 (v14.1+,发布于 2021 年 4 月)是 (iOS 17.4+,发布于 2024 年 3 月)支持稍晚(此处指兼容 vp9 的 webm 时间,vp9 in WebRTC 的兼容时间更早)
H.264 (AVC)★☆☆Chrome / Chromium通用
Firefox通用
Safari通用

怎么选?#

我们不是专业的视频托管平台,不像 YouTube、Bilibili 那样专业到可以向用户提供多种分辨率、压缩算法的选择。

Bilibili 为用户提供了三种压缩算法的视频源Bilibili 为用户提供了三种压缩算法的视频源

最终的选择策略,必须在压缩效率、播放兼容性、编码耗时等维度之间做出权衡。

选择一:AV1 挑大梁,H.264 保兼容#

现代浏览器支持在 <video> 标签中使用 <source> 标签和 MIME type 让浏览器按需播放

<video controls poster="preview.jpg">
  <source src="video.av1.webm" type='video/webm; codecs="av01"' />
  <source src="video.h264.mp4" type='video/mp4' />
  当前浏览器不支持视频播放
</video>

通过这样的写法,浏览器会自动选择最先能解码的 source,无需写复杂的判断逻辑或使用 JavaScript 动态切换。默认的 AV1 编码在最大程度上减少了传输流量降低成本,享受现代浏览器与设备的压缩红利;而 H.264 则作为兜底方案,保证了在不支持 AV1 的 Safari 等老旧设备上的回放兼容性。

然而这个选择可能并不是太合适,一方面我手上最先进的处理器 Apple M4 并不支持硬件编码 AV1 视频,5 分钟的视频压完需要整整 3 个小时,如果还需要视压缩质量来回调整压缩参数重新压上几次,那可真是遭老罪了;另一方面,即使 Chromium / Firefox 等主流浏览器内核现在都支持 AV1 的软解,但在一些硬件较老的设备上播放 AV1 编码的视频可能让用户的电脑风扇原地起飞,这一点在 YouTube 大力推广 AV1 的时候就曾遭到不少用户的诟病。

选择二:VP9 独挑大梁#

考虑到 AV1 编码的高昂成本和用户电脑风扇原地起飞的风险,VP9 也是一个非常具有竞争力的选择。VP9 在主流浏览器中得到了非常好的兼容,因此可以考虑放弃 H.264 的 fallback 方案独挑大梁。而 VP9 硬件编码在近几年的硬件设备上的普遍支持也给足了我勇气,让我可以多次调整压缩质量重新压缩,找一个在文件体积和画面清晰度之间的 sweet point。

由于是 VP9 独挑大梁,因此大多数人可能会考虑使用与 VP9 最为适配的 webm 格式封装视频。但目前在 webm 中最广泛使用的音频编码 opus 在 Safari 上的兼容性并不是太好(在 2024 年 3 月发布的 Safari 17.4 才开始支持),建议斟酌一下是不是继续用回 AAC 编码,并将视频封装在 mp4 中。

https://caniuse.com/opushttps://caniuse.com/opus

音频码率太高?再砍一刀#

上面说了那么多的视频压缩算法,其实只是局限于视频画面的压缩,音频这一块其实还能再压一点出来。

Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)

一个介绍产品的视频,在音频部分采用了 48000 Hz 双声道采样,码率高达 128 kbps,说实话有点奢侈。我直接砍成 64 kbps 单声道,又省下 2MB 的文件大小。

写在最后#

对于前端开发者来说,视频压缩算法的选择早已不是单纯的“压得小不小”问题,而是一场在设备能力、浏览器兼容性、用户体验与开发成本之间的博弈。我们既要跟上技术演进的节奏,拥抱 AV1、VP9 等更高效的编解码器,也要在实际项目中照顾到现实中的设备分布和播放环境。

在理想与落地之间,我们所能做的,就是充分利用 HTML5 提供的容错机制,搭配好合适的编码策略和封装格式,让网页上的每一段视频都能在合适的设备上、以合理的代价播放出来。

毕竟,Web 从来不缺“能不能做”,缺的是“做得优雅”。如果说编码器是硬件工程师和视频平台的战场,那 <video> 标签下的这几行 <source>,才是属于我们前端工程师的战壕。

参见#