FFmpeg与VLC:互联网视频背后的隐形巨人

 

序言:我们每天在 YouTube 看视频、在 Netflix 追剧、在 Discord 分享屏幕,却几乎从不思考这一切背后的技术。FFmpeg 和 VLC——这两个几乎完全由志愿者构建和维护的开源项目——支撑着全球超过 90% 的视频处理工作流。2025 年,Lex Fridman 在他的播客第 496 期邀请了 FFmpeg 和 VLC 社区的核心人物 Jean-Baptiste Kempf 和 Kieran Kunhya,进行了一场长达三小时的深度对话。这篇文章是对那场对话的精华总结——关于汇编语言、视频压缩的数学魔法、开源社区的精神,以及一群在无人知晓的地方为全世界数十亿人默默工作的工程师。

原文基于:Lex Fridman Podcast #496 — Jean-Baptiste Kempf 和 Kieran Kunhya 谈 FFmpeg 与 VLC。


FFmpeg 与 VLC:互联网视频背后的隐形巨人 —— 当志愿者们构建了支撑万亿产业的基石

一场关于 FFmpeg 和 VLC 的深度对话:Lex Fridman 播客 #496 精华总结


我们每天在 YouTube 上看着高清视频,在 Netflix 上追剧,用 Chrome 浏览器打开网页中的视频,在 Discord 里与朋友分享屏幕,用手机看短视频。几乎没有人会停下来想一想这一切是怎么运作的。在那些像素和声音的背后,有一套几乎完全由志愿者构建和维护的开源软件系统——FFmpeg 和 VLC。

2025 年,Lex Fridman 邀请到了两位在 FFmpeg 和 VLC 社区中至关重要的工程师进行了一场长达三小时的深度对话。一位是 Jean-Baptiste Kempf(简称 JB)——VideoLAN 的主席、VLC 和 FFmpeg 背后的核心人物。另一位是 Kieran Kunhya——资深编解码工程师、FFmpeg 贡献者,同时也是那个在 Twitter/X 上极具个性的 FFmpeg 官方账号背后的运营者。如果你没关注那个账号,我强烈建议你去看看。它以幽默又尖锐的方式,毫不妥协地庆祝着开源精神和底层软件工程的伟大。

在这场对话中,Lex 全程戴着标志性的 VLC 橘色锥形帽——这是互联网文化中对这个传奇播放器最真诚的致敬。

Lex Fridman 戴着 VLC 锥形帽与两位嘉宾对话

每个互联网用户的日常,都离不开它

FFmpeg 是什么?它可能是世界上最重要的你不知道自己在使用的软件。它是一套用于处理视频和音频的低级库和命令行工具。而它被用在哪些地方呢?

YouTube 的视频处理管道、Netflix 的内容分发、Chrome 和 Firefox 浏览器的媒体播放、Discord 的屏幕共享和视频通话、OBS 的直播录制、VLC 播放器的核心解码引擎、智能电视的媒体播放、游戏引擎中的视频播放……这个名单几乎可以无限延伸。”你在线看到的任何视频,通常都使用了 FFmpeg,” JB 说。据估计,超过 90% 的在线和离线视频处理工作流都涉及 FFmpeg。

而 VLC 呢?这个被用户亲切地称为”锥形播放器”(cone player)的软件,已经被下载了至少 65 亿次——而这只是能被统计到的数字。JB 分享了一个有趣的细节:VLC 官网 25% 的流量来自搜索 “cone player” 的人。在印度或中国的偏远地区,人们不知道 VLC 这三个字母,但他们认识那个橘色的锥形标志。

“我们去任何地方都有人认出那个锥形标志,” JB 说。”我们曾开玩笑说要改掉这个 logo,说会变成一种毛毛虫工程车的样子。我们说的是愚人节玩笑,结果收到了大约一万封邮件说’不,不要改 logo’。”

视频是怎么在你眼前和耳边出现的?

对于那些不太了解技术细节的人来说,JB 和 Kieran 在播客中做了一个精彩的科普。当你点击一个视频文件按下播放按钮时,实际上发生了什么?

第一阶段:获取字节流。 VLC 或你的浏览器从地址(URL、文件路径、DVD 光盘)读取原始数据。JB 说:”VLC 从设计哲学的根源上就不信任输入。” 因为 VLC 最初诞生于一个校园局域网视频流项目,传输过程中数据可能损坏。这意味着 VLC 必须能够处理破损的文件——这个特质让它后来在处理那些下载到一半的视频文件时大放异彩。

第二阶段:解复用(demuxing)。 原始字节流被切成音频轨道、视频轨道、字幕轨道等。这就涉及到”容器”和”编解码器”的区别。容器(比如 MP4、MKV、AVI)像一个盒子,里面装着不同类型的数据流。而编解码器是实际的压缩和解压缩算法。JB 提到一个有趣的现象:”在 VLC 和 FFmpeg 中,我们完全忽略文件扩展名。我们看文件内部的内容来确定它到底是什么。因为太多人会说’哦这是个视频,肯定是 MP4’——但技术上它可能是 MOV 格式,也可能是 MKV。”

第三阶段:解码。 这是最复杂的部分。压缩后的视频数据需要被还原成原始像素和音频信号。这里涉及熵解码、帧内预测(I-frame)、残差计算、逆变换等一系列复杂的数学运算。Kieran 强调了一个关键事实:高达 45% 的视频文件是无法被 GPU 硬件解码的,需要回退到软件解码——而这就是 FFmpeg 的手写汇编代码大显身手的地方。

一百倍的魔法:视频压缩的艺术与数学

这场对话中最引人入胜的部分之一,是两位嘉宾对视频压缩原理的精彩阐述。

“人们没有意识到视频和音频的压缩程度有多么惊人,” JB 说。”对于音频,从原始音频到 MP3,你压缩了大约十倍。对于视频,你需要一百倍、两百倍的压缩率。”

视频压缩不同于 ZIP 压缩。ZIP 是无损的——数据进去,完全相同的数据出来。而视频压缩是有损的——你主动丢弃信息,但你必须确保丢弃的是人眼和人耳不会注意到的信息。

这就是为什么视频压缩如此精妙:它必须深刻理解人类的感知系统。你不会在视频中使用 RGB 色彩空间,而是使用 YUV——一个是亮度信号,另外两个是色度信号。JB 解释说:”这正好匹配了你的眼睛。你的眼睛里有两种感光细胞:锥状细胞和杆状细胞。其中一些对亮度更敏感,另一些对颜色更敏感。所以我们可以减少色度信号的分辨率,大多数人都察觉不到——仅这一步就将数据量减半。”

每一代新的视频编解码标准(从 H.264 到 H.265 到 AV1 到 VVC)能在相同质量下减少约 30% 的码率。但 Kieran 补充了一个关键的细节:”是 30% 更好的压缩,但可能需要一个数量级甚至两个数量级更多的计算能力来实现。”现代编解码器如 AV1 和 VVC 实际上不是一个单一的编解码器,而是一个”工具集合”——根据内容类型(屏幕共享、实拍视频、动画等)动态选择不同的编码工具。

240,000 行手写汇编:每一纳秒都重要

这场播客中,汇编语言成为了一个反复出现的重要主题。

汇编是什么?简单来说,它是人类能写的最接近计算机硬件的代码。它直接告诉 CPU 芯片上的晶体管该做什么。而 SIMD(单指令多数据)汇编更是神奇——它可以在一条指令中同时对 16 个或更多数据元素执行相同的操作。”在 FFmpeg 中,我们使用 SIMD 汇编能获得 10 倍到 50 倍的速度提升,” Kieran 说。”有一个函数比 C 语言版本快了 62 倍。”

JB 分享了一个令人震惊的数字:整个 FFmpeg 项目有大约 10 万行手写汇编代码。但仅仅 dav1d 这一个项目(一个 AV1 格式的视频解码器)就有 24 万行手写汇编——比整个 FFmpeg 的汇编代码还多一倍。dav1d 的代码库中 79.9% 是汇编,19.6% 是 C,只有 0.5% 是其他。它为大约 30 亿台设备提供 AV1 视频解码能力。

“在 dav1d 中,我们甚至不使用操作系统的函数调用约定,” JB 说。”我们创建了自己的调用约定,因为这样更快。也就是说,我们跳过了操作系统标准规定的那种保存和恢复 CPU 状态的步骤,因为我们知道我们是在自己的二进制文件内部被调用的。据我所知,没有其他任何项目做过这种事。”

当被问到为什么汇编在这个时代依然重要时,JB 的回答发人深省:”我们已经过了硬件速度飞速增长的时代。我们正处于摩尔定律的末尾。无论是 AI、内存还是 CPU 计算,我们对算力的需求在爆炸性增长,但硬件本身的进步速度已经放缓。所以你必须深入技术栈的底层,从现有硬件中挤出每一点性能。”

社区:不关心你是谁,只关心你的代码

对话中最打动人心的是两位嘉宾对 FFmpeg 和 VLC 社区精神的描述。

“重要的是你的代码好不好。我们关心的是卓越的代码。我们不关心你是谁,” JB 说。”就算你是条狗,我也不在乎。我不在乎你来自哪里。我需要看的是你的代码。’哦,但我是这家意大利/德国/美国大公司的工程师。’我们不关心。”

这个社区的核心只有 10-15 个人在维护 FFmpeg,VLC 的核心团队更是只有 5 个人。他们需要为来自全世界上千名贡献者的代码负责。”当你修改了代码然后离开了(因为你换了工作、有了孩子、生活中出了意外),留下来的是我们这些核心维护者。你的代码必须可维护。它必须卓越。”

播客中特别提到了两位汇编天才:Henrik Gramner 和 Martin Storsjö。JB 说:”Henrik 对 Intel x86 汇编的了解深到连 Intel 的人都会说’你们为什么要来问我们?你们有 Henrik,他比我们更懂。’而 Martin——他在手机上用虚拟键盘写汇编代码,就在一边看着他的孩子在游乐场玩耍的时候。这是真正的巫师级别。”

更令人惊讶的是,社区中不乏青少年贡献者。Ruikai Peng 在 16 岁时就为 FFmpeg 贡献了代码——他不只是提交代码,还在代码中发现了安全漏洞并修复了它们,而整个过程他都没有去搞那些安全圈常见的大张旗鼓的”高危漏洞”公告。正如 JB 所说:”在你成为世界上最好的程序员之一的道路上,FFmpeg 是最好的学校。”

逆向工程的疯狂

播客中最能体现这个社区非凡能力的部分,是关于逆向工程(reverse engineering)的讨论。

Kostya Shishkov 是这个领域的传奇。”他看世界的方式是把所有东西都当作’二进制规范’“,Kieran 说。”他不需要文档。他有二进制文件,他就能搞清楚一切。”为了在 VLC 中添加对 GoToMeeting 录制文件的支持——这是 JB 当时收到最多请求的功能——Kostya 逆向工程了一个 20 兆字节的二进制 blob。作为参考,”一兆字节的逆向工程大约需要一个月的工作量。”

Kieran 自己也做过逆向工程,他描述了那个过程:”你把程序在反汇编器中打开,使用大量的直觉去判断——DCT 在哪里?熵编码在哪里?然后你逐条指令单步调试。在很长一段时间里你什么都看不到——你完全在内存层面调试。而且你完全可能把存储系数的缓冲区结构搞错了,走上了完全错误的道路……”

最令人印象深刻的是这个工作的终极意义。JB 说:”现在快进十年、十五年。那个 GoToMeeting.exe 是一个 Windows 32 位的程序。但我现在在用 Android,在用 iPad,在用 RISC-V 架构或者 ARM 架构。你怎么打开那个文件?这些工作——为了让那些文件在未来依然可以被打开——对于整个人类文明来说是极其有用的。”

VLC 的历史:从校园实验到全球现象

JB 分享了 VLC 的起源故事。故事要从 1990 年代中期的法国巴黎中央理工学院说起。

这所精英工程学院有一个特殊之处:整个校园设施——广播电台、电视、超市、图书馆——全部由学生自己管理。”你二十二岁,你需要运营你的校园,否则你就没有电。所以你会在乎这些事情。”

1994-95 年间,学生们想要更快的网络来玩《毁灭战士》。大学回答说校园不归他们管,让学生自己想办法。他们找到了 Bouygues(一家法国大公司)的 CIO,他说:”视频的未来是卫星。”于是学生们在校园里架起了一个巨大的卫星锅,将电视信号通过当时最先进的 155Mbps ATM 网络分发到宿舍——这在本质上是有史以来最早的大规模视频流实验之一。这个项目被称为”Network 2000”。

后来,两个学生决定将这个项目继续下去,创建了 VideoLAN 项目(VLC 中的 VL 就来源于此)。经过三年的斗争,他们终于在 2001 年说服大学将其开源。JB 于 2003 年加入。”2005 年,这个项目本应该死掉了。当时只有两个活跃的开发者。但我认为这项技术很棒,它有用,将来还会有用。我把我的人生和时间投入了进去。”

“不,这不对”:拒绝数千万美元广告收入

互联网文化中有一个广为流传的梗图:JB(戴着那顶 VLC 锥形帽,看起来像一位巫师)旁边写着”VLC 的创造者,拒绝了数千万美元以保持 VLC 无广告”。这是真实发生的事。

“这是真的。我多次拒绝了数千万美元。” JB 说。”是的,我本可以成为一名千万富翁,在某个海滩上晒太阳。但我没有这样做,因为我认为那是不道德的。那不是正确的事。”

他解释说,来找他的公司几乎都是那些”不体面的广告公司”——捆绑恶意工具栏、劫持搜索引擎、在 VLC 界面里插入广告。每次他都说”不”。

“最后的那个报价简直令人发指。他们说:’想想嘛,有了那些钱你可以建一些全新的开源项目。’那是一个心灵诡计……非常难拒绝。但对我来说,这就是不对的。不是我不喜欢钱。只是那件事不对。我非常自私地说——我需要晚上能安心上床睡觉,对自己所做的事感到满意。”

JB 说他并不反对赚钱。他创办了几家围绕开源视频技术的创业公司,最新的一家叫 Kyber,专注于超低延迟视频处理。”但我认为挣钱必须有道德。做偷偷摸摸的广告或者偷数据不是正确的方式。比如如果 Netflix 在某个时候过来说’我们想把 Netflix 功能集成进 VLC 里’——可能故事的结局会不一样。但他们没有来。来找我们的只有那些不正当的广告公司。”

Google 安全事件:当万亿公司对志愿者施压

播客中讨论了一个近期的重要事件。Google 的一个安全团队使用 AI 在 FFmpeg 代码库中自动发现了大量安全漏洞,然后以工业界标准的 90 天截止日期要求志愿者们修复问题——甚至在这些问题修复之前就向媒体宣布了他们的 AI 有多么出色。而这个问题发生在一个 1990 年代的游戏编解码器上——那种只在一张光盘上被使用过一次的极其冷门的编解码器。

“问题在于发现的手段和修补的能力之间严重不成比例,” JB 说。”那些报告非常冗长,几乎是 AI 生成的对一个极其冷门的编解码器的拒绝服务攻击。而且安全社区把一切都标为’高优先级’——’这很重要!高危!可怕!可怕!’——针对的是一个 1993 年在一张光盘上的游戏编解码器。”

但故事的结局是积极的。”这次事件之后,Google 做了一些改变,” Kieran 说。”他们现在开始发送补丁了,也开始为修复问题的人提供奖励。所以因为这个事件,情况确实发生了变化。”

还有一个更惊人的例子:微软 Teams 的一名产品经理在一个全是志愿者的 FFmpeg bug 追踪器上标注他们的问题是”高优先级”。当 Kieran 礼貌地要求微软提供长期维护支持合同时,微软反而只提供了一次性的几千美元。

“万亿级别的公司期望得到志愿者的免费紧急支持。这不可接受,” Kieran 说。但有趣的是,这些充满”辛辣感”的公开曝光确实产生了效果——捐款增加了,更多人意识到了 FFmpeg 的重要性。”不幸的是,我们是如此小,以至于唯一能解决这些问题的强有力的手段就是在社交网络上’曝光’。”

汇编 VS Rust VS AI:编程的未来在哪里?

对话还深入到了当今编程世界的几个热门话题。

关于 Rust: JB 做了一个对比。”Rust 在当你从头开始一个新项目时非常好。但当你需要在与现有代码交互时,情况就变得很糟糕。Rust 社区的一部分人认为他们需要重写一切——不,不要重写。”他说阅读代码比写代码难一个数量级。”你在最高效的时候写下的代码,六个月后你自己都看不懂。所以当你面对一个庞大而复杂的代码库时,你不理解它,于是你想重写。但你不理解的是里面蕴含了那么多智慧、业务逻辑、没有被记录下来的决策原因。”

对于 FFmpeg 来说,JB 还指出一个更深层的问题:”想象一下,我把像 dav1d 或 x264 这样的软件中的 C 部分用 Rust 重写了——更安全了,是的。但当你进入汇编部分时,我们可以跳转到内存中的任意位置。所以即使我把 C 部分用 Rust 重写,安全模型也被手写汇编彻底打破了。我们需要的是’安全的汇编’——一种编译时检查汇编的方式。”

关于 AI: Kieran 说,”我试过用 LLM 来写汇编。它比我想象的要好一些,但做着做着就会出错。于是我说’这是比特精确的吗?’它说’不是。’‘修正它。’然后它做着做着又回到了同样的错误。关于 FFmpeg 汇编的训练数据太少了。”

JB 则从另一个角度看待 AI。”我认为这就是价值所在。当你到了必须从硬件中压榨出每一纳秒的性能的层面——这是 AI 无法 vibe code 出来的。这些最核心的东西不是 AI 可以取代的。”

开源:不仅是软件,更是一个社会契约

对话中,Lex 请 JB 解释了不同的开源许可证。JB 用了一个绝妙的比喻:”开源就像你祖母给你的巧克力芝士蛋糕食谱。在商业软件中,你只拿到了蛋糕。而在开源中,我们给你蛋糕,也给你食谱来重新制作它,同时告诉你如何建造烤箱,以及你如何被允许修改食谱甚至转售给其他人。”

两位嘉宾详细解释了 FFmpeg 和 VLC 使用的 LGPL 许可证。JB 分享了他将 VLC 从 GPL 改为 LGPL 的经历——他不得不联系 350 多个贡献者获取他们的同意,其中有一次他甚至去到了一位工厂工人的工作场所,因为那位工人已故的儿子曾为 VLC 写过代码。

“我向他解释了开源的整个概念,告诉他我不是一家试图窃取他儿子贡献的那两行代码的公司。我当时很年轻,几乎要哭了。那非常困难。”

那些非凡的普通人

播客中最打动人的,是对那些默默无闻但拥有非凡才能的工程师的致敬。

“Kostya Shishkov 看整个世界就像看一个二进制规范。他知道他不需要文档。他有二进制文件,就能搞明白。”

“Henrik Gramner 知道所有 SIMD 指令在 P4、Nehalem、Core 2 等每一代 CPU 上的精确时钟周期数。Intel 自己的工程师都会说:去问 Henrik。”

“Martin Storsjö 在他的手机上用虚拟键盘写汇编代码,就在看着孩子在游乐场玩的时候。”

“Michael Niedermayer 在上世纪 2000 年代所做的工作是西西弗斯式的。他处理的边缘情况多到超乎你的想象——来自中国监控系统的一个奇怪的编解码变体、来自某个已经被遗忘的软件的另一种变体。所有这些都需要被修复,而且不能破坏其他东西。”

“Andreas Rheinhardt 和 Anton Khirnov 在重写 ffmpeg.c 并加入线程支持——从用户的角度看什么都没有变化,但飞机在飞行的过程中被重新建造了。”

结语:现代文明的地基

这场对话被 Lex Fridman 用心地策划和主持。他戴着那顶 VLC 锥形帽坐了整整三个多小时,以最真诚的方式表达了敬意。

在对话的最后部分,他做了一个深刻的总结:”令人鼓舞又令人谦卑的是,如此多的现代文明建立在那些不是在追逐名利、而是痴迷于工程技艺的人所构建的软件之上。我们生活在一个每天有数十亿人消费视频却从未想过其下方隐形机制的世界。但那个机制很重要。开源基础设施很重要。这是人类安静地跨越边界合作,为我们其他人构建有用、持久和优雅事物的伟大范例之一。”

播客中有几组关键数字在这里特别值得记住:

  • FFmpeg 大约有 10 万行手写汇编代码
  • dav1d 单独就有 24 万行手写汇编
  • VLC 被下载了至少 65 亿次
  • 90% 以上的视频处理工作流涉及 FFmpeg
  • Netflix 30% 的视频内容、YouTube 50% 的视频内容使用 AV1 格式
  • 30 亿台设备在使用 dav1d 解码 AV1 视频
  • FFmpeg 核心维护者约 10-15 人,VLC 核心团队约 5 人
  • FFmpeg 至今约有 2,000-3,000 人贡献过代码
  • JB 曾为联系 350 多个贡献者进行版权重新授权而奔波

这场近三小时的对话展示了三层信息。最底层是极其硬核的技术——视频压缩、汇编优化、CPU 架构、逆向工程。中间层是开源社区的运作机制——代码审查、许可证、贡献者关系、社区治理。最顶层则是一种精神——那些在没有人看见的地方,为全世界数十亿人默默工作的志愿者工程师们所代表的某种东西。

在他们身上,你能看到一种几乎已经消失在这个时代的品质:对技艺本身的纯粹热爱。不是为了名声,不是为了金钱,不是因为有人要求他们这么做。只是因为这件事情本身就值得做。正如 JB 所说:”我需要在每晚睡觉时能对自己所做的事感到满意。”

下次你打开 YouTube、Netflix 或者 VLC 的时候,不妨想一想——在你的电脑里,有几十万行手写汇编代码正在运转。那些代码的后面,是来自世界各地的志愿者工程师,他们中的很多人在你根本不知道名字的情况下,为你安静地完成着不可思议的工作。