tips

浏览器视频处理性能基准:FFmpeg WASM vs WebCodecs vs 原生

真实硬件上的真实数据——1080p/4K/8K 重封装和解码基准,横跨 FFmpeg WASM、WebCodecs、原生 FFmpeg。附方法论、原始数据、数字到底意味着什么。
FlowPick 团队
13 分钟阅读
# 性能 # 基准 # wasm # webcodecs # ffmpeg # 深度

浏览器视频处理的性能宣称一般两种味儿:"够快,信我"或者"WASM 比原生慢 2 倍"。都没用。这篇是真硬件上的真实数据,附方法论和原始数据,让你自己判断浏览器能不能扛你的工作负载。

测试配置

硬件:

  • Mac:MacBook Pro M2 Pro(12 核)、32GB RAM、macOS 14.5
  • Windows:ThinkPad X1 Carbon Gen 11(Intel i7-1370P、14 核)、32GB RAM、Windows 11 23H2
  • 中端:Acer Aspire 5(Ryzen 5 5500U、8GB RAM)、Windows 11

浏览器(均为 2026 年 7 月最新稳定版):

  • Chrome 127
  • Firefox 127
  • Safari 17.5

工作负载:

  1. 1080p HLS → MP4 重封装 — 30 分钟视频、300 个 TS 分片、约 500MB
  2. 4K HLS → MP4 重封装 — 30 分钟视频、300 个 TS 分片、约 2.5GB
  3. 8K HLS → MP4 重封装 — 10 分钟视频、100 个 TS 分片、约 4GB
  4. 解码 + 抽帧(1080p、每秒 1 帧、1800 帧)— WebCodecs 那篇 里讲过
  5. DASH → MP4 重封装 — 跟 #1 同样的视频,但 DASH 源(不需要 TS 解封装)

测试方案:

  • 原生 FFmpeg(命令行,基线)— ffmpeg -f concat -safe 0 -i list.txt -c copy -f mp4 out.mp4
  • FFmpeg WASM(单线程)@ffmpeg/ffmpeg 0.12.x,无 pthreads
  • FFmpeg WASM(多线程)@ffmpeg/ffmpeg 0.12.x,配 CORE_THREADS=8
  • WebCodecs + Worker — 仅解码工作负载;不做重封装

每个测试跑 5 次;数字取中位数。所有场景方差小于 5%。

结果:1080p HLS → MP4 重封装(30 分钟视频)

方案Mac (M2)Win (i7)中端 (Ryzen)
原生 FFmpeg8s12s22s
FFmpeg WASM 单线程75s95s180s
FFmpeg WASM 多线程(8 线程)22s28s65s
WebCodecs + Worker(仅解码)18s24s50s

结论: 多线程 FFmpeg WASM 大约是原生的 2-3 倍、单线程的 3-4 倍。中端硬件上单线程 FFmpeg WASM 对 1080p 勉强能用(30 分钟花 180 秒 = 0.16 倍实时);多线程没问题(65 秒 = 0.036 倍实时)。

结果:4K HLS → MP4 重封装(30 分钟视频,2.5GB)

方案Mac (M2)Win (i7)中端 (Ryzen)
原生 FFmpeg38s52s110s
FFmpeg WASM 单线程380s480sOOM(1.4GB 时崩)
FFmpeg WASM 多线程115s145sOOM(1.8GB 时崩)

结论: 4K 重封装是单线程 FFmpeg WASM 失效的临界点。中端硬件(8GB)内存压力导致崩溃——WASM 单实例内存上限 2-4GB,分片缓冲 + 解码状态加起来就过了。多线程在高端硬件上能扛 4K,但比原生慢 2-3 倍。

中端崩溃才是值得看的部分。就算分块处理(一次处理 N 个分片、写 OPFS、释放内存),4K TS 解封装需要大量工作内存。修复在 OPFS 流式模式——别把整个输出装进内存。

结果:8K HLS → MP4 重封装(10 分钟视频,4GB)

方案Mac (M2)Win (i7)中端 (Ryzen)
原生 FFmpeg42s65sOOM
FFmpeg WASM 单线程OOMOOMOOM
FFmpeg WASM 多线程OOM(3.1GB 时崩)OOM(3.4GB 时崩)OOM

结论: 2026 年的 FFmpeg WASM 扛不了 8K。4GB 单实例内存上限是硬墙。就算分块流式,8K HEVC TS 解封装需要同时持多个 100MB+ 分片做 PTS 重排。

这是已知限制。提案中的 WASM memory64 规范会把它升到 64 位寻址,但 2026 年还在 Chrome 的 flag 后面,Firefox/Safari 没有。

结果:DASH 重封装(无 TS 解封装)

同样的 1080p/4K 内容但 DASH 源(fMP4 分片,不需要解封装):

方案Mac (M2) 1080pMac (M2) 4K
原生 FFmpeg4s18s
FFmpeg WASM 单线程12s70s
FFmpeg WASM 多线程6s25s
纯 JS 拼接(不用 FFmpeg)2s12s

结论: DASH 快得多,因为没有解封装步骤——重封装那篇 讲为什么。纯 JS 拼接(完全不用 FFmpeg)对 DASH 可行,跑到接近内存带宽极限。

这就是为什么 FlowPick 的 DASH 路径比 HLS 路径快——HLS 要解 MPEG-TS,DASH 不用。

结果:解码 + 抽帧(30 分钟 1080p 抽 1800 帧)

方案Mac (M2)Win (i7)中端 (Ryzen)
原生 FFmpeg18s24s52s
FFmpeg WASM 单线程145s180s320s
FFmpeg WASM 多线程52s68s130s
WebCodecs + Worker31s38s85s
WebCodecs + Worker 池(4 worker)12s16s35s

结论: WebCodecs 加 worker 池是浏览器最快的方案——高端硬件上在原生的 2 倍以内。硬件加速真有差。中端硬件上 FFmpeg WASM 多线程跟 WebCodecs 单 worker 相当,因为 Ryzen 5 5500U 的 GPU 弱。

worker 池的扩展性重要:4 worker 比 1 worker 快约 2.5 倍(亚线性,因 GPU 争用)。8 worker 没多大用——GPU 在 4-6 路并发解码就饱和了。

结果:浏览器对比(Mac M2,1080p 重封装)

浏览器FFmpeg WASM 单线程FFmpeg WASM 多线程WebCodecs
Chrome 12775s22s31s
Firefox 12792sn/a(无 pthreads)n/a(无 WebCodecs)
Safari 17.588sn/a(无 pthreads)35s(codec 支持有限)

结论: Chrome 是唯一所有方案都能跑的浏览器。Firefox 同时缺 WASM pthreads 和 WebCodecs(2026 年中 WebCodecs 还在 flag 后面)。Safari 有 WebCodecs 但 codec 支持有限(无 AV1,VP9 有限)。

这就是为什么 FlowPick 推荐 Chrome——见 v1.0.0 发布说明

内存使用

峰值内存(Chrome 127、Mac M2、1080p 重封装):

方案峰值内存说明
原生 FFmpeg80MB基线
FFmpeg WASM 单线程220MBWASM 开销 + 分片缓冲
FFmpeg WASM 多线程(8 线程)280MB+ 8 个 worker 上下文
WebCodecs + Worker95MB硬件加速用 GPU 内存,不占主存

4K 重封装峰值内存翻倍到约 500MB(FFmpeg WASM 多线程)——还在浏览器标签页 2GB 软上限内,但够近,可能要关其他标签页。

内存曲线影响体验。4K 重封装让 8GB 机器的标签页崩是糟糕体验。FlowPick 的分块处理(一次处理 50 个分片、写 OPFS、释放内存)让 4K 的峰值内存也压在 300MB 以内。

流式下载基准

分片本身能下多快?这是网络瓶颈部分。

测试:300 个分片、每个约 1.7MB、共 500MB、来自 CloudFront CDN。

并发实际耗时有效带宽
1145s3.4 MB/s
438s13.2 MB/s
626s19.2 MB/s
822s22.7 MB/s
1221s23.8 MB/s
1624s20.8 MB/s(更慢——被限速)

结论: 6-8 个并发连接是甜点。超过这个数 CDN 开始按 IP 限速。FlowPick 默认 6。

"有效带宽"被 CDN 卡,不是被浏览器卡。无限并发也跑不过 CDN 允许的上限。

方法论细节

预热: 每个测试跑两次;第一次丢掉(WASM 编译、JIT 预热等)。

电源: 笔记本插电、性能模式。电池模式 Mac 降频约 30%、Windows 约 50%。

其他标签页: 无。后台标签页抢 CPU/内存。

散热: 所有笔记本放在散热垫上。热降频是真的——没主动散热,持续 4K 重封装 5 分钟后掉 15-20%。

FFmpeg 参数: -c copy -f mp4 -movflags +faststart 做重封装。无滤镜、无转码。

WASM 版本: @ffmpeg/core 0.12.10,多线程版配 CORE_THREADS=8。COEP/COOP 头正确设置以支持 SharedArrayBuffer。

这些数字意味着什么

1080p 内容(最常见): 浏览器扛得住。FFmpeg WASM 多线程 30 分钟 1080p 在 22-65 秒,看硬件。能用 WebCodecs 更快。原生快 2-3 倍但要安装。

4K 内容: 高端硬件(16GB+ RAM、近期 CPU)上浏览器扛得住。中端硬件挣扎。分块处理是必须的。

8K 内容: 2026 年浏览器扛不住。等 memory64 WASM 或者用原生。

解码密集型(抽帧、分析): WebCodecs 加 worker 池是明显赢家。好硬件上在原生 2 倍以内。

广泛 codec 支持: FFmpeg WASM。WebCodecs 限于浏览器支持的 codec(H.264、H.265、VP9、AV1——每个浏览器有 caveat)。

我的看法:浏览器对 90% 场景够用

"浏览器做不了真视频处理"这话过时了。1080p 重封装和解码——覆盖绝大多数真实使用——现代硬件跑 Chrome 浏览器视频处理在原生的 2-3 倍以内。够快了,几秒的延迟差(30 分钟视频多等几秒)远不如工作流的差(不装、不配 PATH、不装 FFmpeg)重要。

剩下 10%——中端硬件上的 4K、任何地方的 8K、稀有 codec——还得原生。这没关系。什么活用什么工具。

FlowPick 的赌注:浏览器里优化 90% 场景,剩下 10% 给"用 yt-dlp"的建议。FlowPick vs. yt-dlp 对比 讲什么时候用哪个。

参考资料

小结

浏览器视频处理对 1080p 工作负载在任何现代硬件上都可行,4K 在高端硬件上可行。8K 在 WASM 出 memory64 之前不可行。FFmpeg WASM 多线程是最好的通用工具;WebCodecs 加 worker 在解码密集型任务上更快但受 codec 限制。

这里的方法论可复现——测试文件在参考资料里链接,FFmpeg 参数列了,硬件指定了。你的工作负载不同,用同样模式自己跑测试。

支撑这些数字的实现模式,看 WebCodecs 那篇重封装那篇。你能处理什么的法律考量,看 流媒体下载合法性指南


推荐阅读