高飞
26-05-08 15:50 微博认证:至顶科技创始人 AI博主

#模型时代# FFmpeg和VLC:不到20个志愿者,拒绝数千万美元,撑起全球90%的视频处理

这期是技术加情怀了。极少数人基于热情和对卓越的执念,构建了数十亿人每天依赖但普通人从不知晓的基础设施。

来自Lex Fridman播客第496期,2026年5月7日发布。嘉宾是VLC媒体播放器的核心开发者、VideoLAN基金会主席Jean-Baptiste Kempf(以下简称JB),以及FFmpeg长期贡献者、编解码器工程师Kieran Kunhya。Kieran同时也是Twitter/X上那个以辛辣风格闻名的FFmpeg官方账号的运营者。

FFmpeg是YouTube、Netflix、Chrome、Discord等几乎所有涉及视频或音频的平台背后的隐形骨架,估计全球超过90%的视频处理流程都涉及FFmpeg。VLC累计下载量超过65亿次。两个项目的核心维护团队分别只有10到15人和5到8人,全部由志愿者组成。JB目前还在创办一家名为Kyber的超低延迟实时控制SDK公司,主要面向机器人遥控、无人机和云游戏场景。Kieran则经营着Open Broadcast Systems,为体育赛事直播提供专业编码和解码设备,客户包括BBC World Service等广播机构。

一、从文件到像素:视频播放链条的每一环都是一个人一辈子的工作

1、视频压缩的本质是为人眼做减法
视频压缩率通常在100到1000倍之间。所有编解码器的设计目标都是模拟人类感知系统来决定丢弃什么信息。视频处理不在RGB色彩空间上工作,而是转换到YUV空间,把亮度和色度分开,因为人眼对亮度变化远比对色彩变化敏感。一个常见技巧是降低色度通道的分辨率,光这一步就能把数据量减半,但大多数人完全察觉不到。

压缩和ZIP这类无损压缩完全不同。ZIP是数据进去、原样出来。视频压缩是在降质,关键在于用数学手段让降质过程尽可能符合人类感知特征。

2、播放一段视频涉及的处理链条远比想象中复杂
从URL获取字节流,用解复用器把容器格式切分成独立的视频、音频、字幕轨道。然后探测每一帧的编解码器类型,判断能否用GPU硬件解码。Kieran提到,大约45%的文件无法用GPU解码,必须回退到纯软件解码。

软件解码流程是:先做熵解码(去除数学层面的编码),然后读取帧内预测的语法元素(空间域操作),再处理残差信号(存储在频率域),做逆变换回到空间域,叠加残差。Kieran说了一句让人停下来的话:"我们刚才每说一句话,都是某个人一辈子的工作量。每句话背后都有成千上万的人在这个行业中研究,有专门的书在讲。"

从2000年代开始,主流视频编解码器有一项严格要求叫bit exactness,即无论谁的解码器实现,对同一个文件必须输出完全一致的比特流。Kieran提到,1990年代的MPEG-2没有这个要求,业内公认这是视频行业犯过的最大错误之一。bit exactness也是FFmpeg测试体系FATE的核心检验指标。

3、容器和编解码器是两回事,但连行业自己都在制造混乱
MP4是容器格式,H.264是编解码器。但H.264的正式名称是MPEG-4 Part 10,因为MPEG-4本身是一个包含多种编解码器的元规范。所以人们把MP4和H.264搞混,这种混乱很大程度上就是行业自己的命名体系造成的。JB说VLC和FFmpeg在解析文件时会直接忽略文件扩展名,深入分析文件内容来判断实际格式,因为太多文件的扩展名和实际内容不匹配。

4、VLC能打开一切的秘密在于它的"不信任"哲学
VLC最初是法国一个大学校园网视频流项目的客户端,通过UDP传输视频。UDP传输会丢包,所以从第一天起VLC就被设计成不信任输入数据。这种理念渗透到了整个架构中,成为一种文化。当年盗版内容泛滥时,AVI格式的元数据放在文件尾部,下载到一半就没有元数据。其他播放器直接报错,VLC会尝试解析残缺文件继续播放,因此迅速积累了大量用户。

二、开源社区的运转逻辑:许可证是唯一的社会契约
1、开源许可证的核心区别在于"是否要求回馈修改"
JB用了一个巧克力蛋糕的类比:买蛋糕只给你成品,开源是给你蛋糕、给你配方、教你怎么造烤箱,还允许你修改配方转卖给别人。

许可证分两大类。宽松型如MIT和BSD,拿去用就行,想怎么改怎么改。Copyleft型如GPL和LGPL,要求你把修改回馈给社区,强度从弱到强分级。FFmpeg和VLC主要使用GPL/LGPL。JB特别强调许可证是社区唯一的共识,"社区在其他事情上几乎什么都达不成一致,唯一的共识就是许可证。"

2、重新授权意味着追踪每一位贡献者,包括已故者的家属
JB把VLC核心引擎libVLC从GPL改成了LGPL,原因有两个:让第三方应用可以集成VLC引擎(比如游戏里播放视频,不用把整个游戏开源),以及解决苹果App Store对GPL应用的兼容性问题。

为此他必须联系超过350位贡献者获得同意。有些人只留了一个邮箱地址,他不得不通过各种方式追踪。他甚至亲自跑到某些人的工作单位去找人。其中一位贡献者已经去世,写代码的是他的儿子。JB不得不向一个工厂工人父亲解释开源许可证的含义,请他签署授权变更文件。"我们在谈论的是人的生命。"JB说他当时几乎流泪了。

3、代码质量是唯一的通行证
"你的代码好不好?这是我们唯一关心的。我们不在乎你是谁。也许你是一条狗,我不在乎。"JB的这段话概括了FFmpeg和VLC社区的核心文化。有人提交补丁被拒绝后说自己是某大公司的工程师,回答是:我们不在乎。

VLC核心团队5到8人,FFmpeg核心团队10到15人。从项目历史开始算,大约有2000到3000人给FFmpeg贡献过代码,但留下来的只有1%。这意味着核心团队最终要维护所有人写的代码,所以必须坚持极高的标准。JB说:"你的代码可能是好的,但我们需要卓越。因为我们只有几个人维护对整个世界至关重要的东西。"

三、拒绝数千万美元,坚持不在VLC里放广告
1、JB多次拒绝了数千万美元级别的商业化提案
提出报价的都是些想在VLC里捆绑工具栏、修改默认浏览器或搜索引擎、植入广告的灰色公司。在2000年代,下载一个软件被偷偷安装恶意软件是非常普遍的事情。JB说如果Netflix当年来谈合作,故事可能不一样,但来的都是灰色广告公司。

他拒绝的理由干脆:这样做不道德,他晚上睡不着觉。如果接受了,三年后项目就会死掉,有人会分叉代码重新开始,而他会背叛了所有其他贡献者的劳动。最后一次报价的金额他用了"obscene"(离谱)这个词形容。对方甚至用了心理战术:"想想你拿了这笔钱可以建设新的开源项目。"他的回答是不行,这不对。

2、VLC完全离线运行,没有任何遥测数据
VLC不和任何服务器通信,没有遥测功能,不收集用户行为数据。JB说VLC团队根本不知道用户在用软件做什么。和外部的合作仅限于技术支持层面,比如驻阿富汗美军反映VLC的RTSP播放功能坏了影响了军营士气(他们晚上靠看电影打发时间),JB给他们单独出了一个修复版本。

四、手写汇编:一门正在消亡的极致优化艺术
1、dav1d项目的核心数字:30000行C代码,240000行手写汇编
dav1d是VideoLAN旗下的AV1解码器项目。AV1由Alliance for Open Media(成员包括Google、Netflix、Amazon、Apple、Mozilla和VideoLAN)制定,是一种免专利费的视频编解码标准。当AV1发布时,很多人说这种格式太复杂,必须用硬件解码。JB和团队用极端的软件优化证明了相反的结论:用一到两个CPU核心就能流畅解码720p AV1视频。

作为参照,FFmpeg为所有编解码器写的汇编代码总量大约10万行,而dav1d一个项目就有24万行。按代码组成比例看:79.9%汇编,19.6% C,0.5%其他。Netflix目前约30%的流量使用AV1编码,JB在播客中提到YouTube也有超过50%的内容采用AV1。全球大约30亿台设备需要解码AV1视频,很多设备没有硬件解码器,依赖dav1d的软件解码。

2、手写SIMD汇编比C代码快10到62倍,而且这个差距无法被编译器弥合
SIMD的全称是单指令多数据,一条指令可以同时对16个甚至更多数据元素执行操作,天然适合视频这种像素网格处理。FFmpeg的做法是不使用任何抽象层,直接用裸汇编指令操控CPU寄存器。Kieran展示过一个函数,手写汇编比C实现快62倍。

两年来,每次他们在Twitter上发布这类数据,都会引来大量争论。反对者说现代编译器的自动向量化已经够好了,手写汇编没必要。Kieran的回答是:"差距不是5%或10%,是好几倍。根本不在同一个量级。"

3、dav1d甚至不遵守操作系统的函数调用约定
dav1d为了速度,在内部创建了自己的函数调用约定。正常情况下,一个函数调用另一个函数时,需要按操作系统规定的方式保存和传递寄存器数据。dav1d知道自己是在库内部调用,跳过了标准的寄存器保存流程,避免了L1/L2缓存的额外读写开销。这需要对CPU架构有极深的理解。

而且这种优化在每一个指令集架构上都要重做一遍:x86的AVX-512、AVX,ARM的Neon、SVE,RISC-V,全部手写。运行时检测CPU能力,设置函数指针,然后执行对应架构的最优代码路径。

4、汇编教学目前像铁匠带学徒,一对一传授,不具备规模化能力
Kieran对现有汇编教材不满意,因为它们都像教语法一样把每条指令从头讲一遍。他开发了一套asm-lessons教程,从FFmpeg实际场景出发,要求的前置知识只有高中数学和C语言(主要是指针)。已经有人通过这套教程完成了对FFmpeg的首次贡献。
Daniel Kang在高中时就为FFmpeg写了大量汇编代码。Ruka Peng在16岁时提交了自己的首批FFmpeg贡献,不只是找到安全问题,而且直接修复了。"没有门槛。你可以学C,可以学汇编,可以给被数十亿人使用的世界级技术做贡献。"

LLM目前还写不好FFmpeg风格的汇编。Kieran试过让它修改代码并保证bit-exact,它做不到,还会反复犯同样的错误。根本原因是训练数据中这类代码太少。

5、Rust重写派忽略了一个致命矛盾:汇编可以跳转到内存任意位置
JB和Kieran对Rust的态度截然不同但结论一致。JB在自己的新公司Kyber里大量使用Rust,承认它在内存安全方面确实优于C++,从零开始写新项目时表现出色。Kieran则说Rust有"世界语氛围",理想主义先行,实际落地不足。

两人的共识在于:Rust重写现有项目几乎永远是错误决策。JB引用了一条编程界的基本定律——读代码比写代码难一个数量级。重写者到了80%很快,到90%费点劲,最后那10%的边缘情况要花掉99%的时间。更关键的是,即使把dav1d或x264的C代码全部用Rust重写来增强安全性,一旦进入手写汇编部分,汇编指令可以跳转到内存中的任意地址,Rust的整个安全模型就被击穿了。JB提出的替代方案是做"安全汇编",在编译时检查汇编代码的内存跳转行为,而不是把上层语言换掉。

五、逆向工程编解码器:在二进制荒原上做考古
1、逆向工程一个20MB的二进制文件可能需要数月时间
一般来说,逆向一个1MB的二进制blob大约需要一个月。FFmpeg社区有一位传奇人物Costa(乌克兰人,居住在德国),他逆向工程的二进制文件达到20到30MB。

逆向工程的流程是:找到视频会议软件中负责解压缩的具体模块,在反汇编器中找到钩子点,把模块单独运行来解码样本文件并导出原始YUV数据作为对比基准。然后在反汇编器中凭直觉寻找DCT在哪里、熵编码在哪里、帧内预测在哪里。很长一段时间你什么都看不到,因为从熵解码到帧内预测到运动预测到IDCT,整个链条都对了之后才能输出图像。你可能在某个完全错误的方向上花了几周才发现自己搞错了。

2、GoToMeeting编解码器的逆向是社区传说级别的成就
JB为GoToMeeting支持悬赏后,Costa在两个月内完成了逆向工程。他的方法描述起来轻描淡写:"我看了这段代码,这里像是我在WMV里见过的DCT。"而且他写的代码里藏了很多和JB开玩笑的彩蛋。

这类工作对人类文明有实际价值。今天GoToMeeting这个软件已经很少有人知道了,但文件还在。如果那个Windows 32位的解码器.exe文件不能在Android、iPad或RISC-V上运行,那些历史录像就永远丢了。

3、寻找测试样本本身就是一场冒险
逆向工程需要尽可能多的样本文件来测试各种编码工具的组合。有时候一个编解码器只能找到一两个样本。Kieran在逆向Cineform时碰巧找到一个大量使用平坦色块的动画样本,这让他能跳过复杂的编码工具先跑通基础流程。VideoLAN过去会在Twitter上公开征集样本,有时候会遇到金矿般的回应——某个公司因为历史原因有十万个这类文件。

六、编解码器的代际演进与专利战场
1、每代编解码器在相同质量下节省约30%带宽,但编码所需算力增长一到两个数量级
从MPEG-2到DivX到H.264到HEVC到AV1,基本概念一脉相承:逆变换、帧内预测、运动补偿、熵编码。但每一代增加更多编码工具,搜索空间指数增长。AV1比H.264在相同视觉质量下省40%到60%带宽,但编码所需CPU时间增加了约两个数量级。YouTube的做法是先用H.264编码所有视频,等视频变成热门内容后再用AV1重新编码,因为编码只做一次但播放要做上百万次。

2、IPB帧结构:解码顺序和播放顺序可以完全不同
视频流由三种帧组成。I帧是完整帧,相当于一张独立的JPEG图片。P帧是预测帧,只记录与前一个I帧或P帧的差异,因此必须先解码它依赖的帧。B帧是双向预测帧,可以同时依赖过去和未来的帧。

B帧的存在意味着编码器发出的帧顺序和观众看到的播放顺序不一样,解码器必须先等到后面的参考帧到了才能回头解码B帧。JB说他刚入行时B帧的逻辑让他最为震撼。还有一种叫intra refresh的技术,整个视频流只在最开头发一个I帧,之后永远不再发完整帧,而是渐进式地刷新画面的不同区域。这对Kyber做的超低延迟传输尤其有用。
3、x264靠"人眼优先"颠覆了20年的行业迷信

在x264之前,视频编码行业20年来一直用一个叫PSNR的数学指标来衡量编码质量,本质是计算原始图像与压缩图像之间的均方误差。问题在于,优化PSNR的最佳策略是给所有地方均匀加一点微小误差,结果就是画面整体偏糊。

x264的开发者Lauren Merritt引入了psycho-visual rate distortion,用人眼感知模型来指导编码决策。同时引入自适应量化,把更多比特分配给视觉上重要的区域,从草地和树叶等高频纹理上节省比特。他坚持一个原则:"我不想在3万美元的专业显示器上测试,我要在普通人的笔记本上看起来好。"

这个方法后来被验证到了极致。瑞典电视台制作的Park Joy测试序列成为编码器能力的终极试金石,里面有水面反光、树叶摇动、人物运动等高难度内容,用传统PSNR指标得分高的编码器在这个序列上画面惨不忍睹。Warner Brothers的工程师Chris Henderson冒着职业风险在公司内部推动用这个免费开源编码器制作蓝光碟片,结果画质远超商业方案。

4、多媒体领域是仅次于移动通信的专利密集区
H.264时代的专利授权还算合理,由MPEG LA统一管理。但到了HEVC,各方为了塞更多专利进规范把很多实际用途极低的技术也写进了标准,导致授权方从一家变成了MPEG LA加HEVC Advance再加若干独立持有者,费用可能达到每年数亿美元。HP在几个月前决定从Windows笔记本中移除HEVC支持,原因就是专利费太高。

这直接催生了Alliance for Open Media。Google、Meta、Netflix投入数亿美元就能自己造一个免费编解码器。AV1和AV2的标准制定过程中会做专利排查,而MPEG体系中专利问题被明确排除在标准讨论之外。VLC设在法国,因为法国不承认软件专利。JB算过,如果要为VLC支付所有涉及的专利许可费,每个用户要付超过200欧元。

5、AV2已经在路上,David 2(dav2d)也在开发中
AV2比AV1再省约30%带宽。JB在2026年CES上做了VLC运行AV2的首个公开演示。David 2的名字叫dav2d(注意数字2),是一个递归缩写:dav1d is an AV1 decoder。JB在播客中指出"d"在法语里是"2"的意思。

七、大公司与开源社区的权力不对称
1、Google用AI批量生成安全报告丢给志愿者处理,先去媒体宣传再说
Google用AI扫描FFmpeg代码发现安全漏洞,按行业标准90天期限通知修复,但没有考虑到志愿者驱动开发的特性。有一个漏洞是在1990年代一款游戏的冷门编解码器上发现的,被标记为高危。AI生成的报告冗长啰嗦,对志愿者构成了"AI拒绝服务攻击"般的工作量。更令人不满的是,Google在漏洞修复之前就去媒体上宣传自家AI的安全分析能力。

Kieran用了一个比喻:这就像有人用高端工具去撬你家门锁,然后告诉你"你的锁不安全,你得自己想办法",而他们明明有资源帮你换锁。在那次事件之后,Google开始提交修复补丁,也开始为修复安全问题提供奖励,所以这场争论产生了正面结果。

2、微软Teams在FFmpeg的公共bug追踪器上标注"高优先级",期望免费企业级服务
FFmpeg那条著名的推文展示了微软Teams团队的一位经理在一个全由志愿者维护的bug追踪器上,直接写"这对Microsoft Teams来说是高优先级"。当FFmpeg礼貌地提出签支持合同时,微软提出一次性支付几千美元。Kieran评论说,这些公司把开源项目当成了签过服务级别协议的付费供应商。

3、有时候,在社交媒体上"点名"是小团队能动用的唯一有效武器
VLC在Android Play Store上有一个bug导致超过一年无法更新应用,近1亿用户受影响。唯一让Google有人回应的办法是发了一条措辞激烈的推文说要停止分发Android版VLC。与微软的Windows Store也发生过类似情况。JB说VLC可能是Windows上使用量排名前十的软件,但他不在微软的独立软件供应商合作计划里,没有任何对口联系人,而Adobe、Spotify这些公司都有。

八、VLC的起源故事和开源维护者的精神负担
1、VLC的血统可以追溯到1990年代法国一群想打电子游戏的大学生
法国顶尖工程学院Ecole Centrale Paris的校园由校友非营利组织管理,一切由学生自治。1990年代中期,学生们想要更快的网络打Doom和Duke Nukem,大学说校园不归我们管你们自己解决。他们找到法国电信公司Bouygues的CIO,对方提供了一面卫星天线,让他们把卫星视频信号用MPEG-2 TS格式直接在校园网上组播。这个叫Network 2000的项目demo只有40秒,45秒后就崩溃,但demo是40秒所以没问题。

一年后两个学生说也许其他人也想在局域网上看视频,创建了VideoLAN项目。客户端部分后来成了VLC。2001年开源。JB 2003年加入(他是在那一年进入这所大学),后来创建了VideoLAN非营利组织,把项目从大学独立出来。2005年项目几乎死掉,只剩两个活跃开发者,是JB坚持让它活了下来。

2、开源维护者的倦怠是真实且严重的系统性问题
那张著名的meme图完美概括了现状:现代数字多媒体基础设施的巨大积木塔底部,有一个标注着"一个内布拉斯加州的随机开源项目"的小方块撑着一切。XZ事件就是典型案例:一个人独自维护,被两个攻击者用持续的深夜问题轰炸逼到崩溃,最后把提交权限交给了攻击者。

JB收到过死亡威胁。2009或2010年,当他决定不再为VLC维护PowerPC端口时,有人寄来一封信,里面装着白色粉末(当时有过炭疽邮件恐慌),信上写着他应该去死。他母亲吓坏了,报了警。他说那次经历在当时极其痛苦,但回头看反而"折叠"了他,让他后来能承受各种攻击。

3、人们为什么无偿贡献?因为视频很酷,因为这是最好的编程学校,因为你能对奶奶解释你做了什么
JB总结了三层驱动力。第一层是兴趣:很多人因为爱看动漫进入社区,JB自己因为爱看电影。第二层是成长:FFmpeg社区是世界上最好的编程学校,你的代码会被最资深的程序员逐行审查。Andrew Kelly(Zig编程语言的创始人)就是FFmpeg的毕业生。第三层是成就感:你在咨询公司写发票下载门户,没法对外婆解释这有什么意义;你说"我让你的笔记本能播放视频",她听得懂。

九、流媒体、超低延迟和多媒体的未来
1、自适应流媒体的核心挑战其实没有编解码器那么复杂
现代流媒体的基本原理:服务端为同一个视频编码7种不同分辨率和码率,客户端根据下载速度在各个分辨率之间切换。如果一个分段的下载时间超过其播放时长的50%,就降一级。真正的心理学挑战在音频端——当系统在不同音频编码档次之间切换时,声音质量的突变比视频更容易被察觉。

2、JB创办的Kyber追求4毫秒端到端延迟,让距离消失
Kyber只用一条QUIC连接完成所有通信。QUIC是一种基于UDP的传输协议,天然为低延迟设计。在同一条连接上同时传输视频、音频和控制信号(鼠标、键盘、手柄),并且维持多路流之间的时钟同步。机器人可能有多个摄像头和多种传感器,如果时钟漂移不被校正,用这些数据训练的AI模型每次重训结果都不一致。

目前Kyber在Windows到Windows之间达到了7毫秒端到端延迟,其中Nvidia硬件编码器就占了3.5毫秒,Intel解码器占2毫秒。4毫秒的目标等效于240Hz刷新率。JB在CES展示了一辆全3D打印的漫游车,从法国远程控制。

3、FFmpeg和VLC的终极方向是成为所有人类感官数据的编解码基础设施
JB给多媒体下了一个更宽的定义:"多路时间同步的人类感官数据流"。VLC已经有了VR/XR版本,有实验性的触觉反馈haptic插件支持4D影院的液压座椅数据,有空间音频模块。未来如果有气味传感器和气味扩散器被标准化,它会进入FFmpeg——左鼻子右鼻子立体声嗅觉。如果脑机接口产生了神经数据编解码标准,FFmpeg也会支持。
档案保存社区已经在用FFmpeg做这件事。他们资助开发了无损编解码器FFV1,设计目标是在磁带存储中即使丢失一个比特也能快速恢复,不会因此丢掉整个画面组。这个社区由纽约城市大学的Dave Rice牵头,他们把工作流程开源后教给预算有限的国家,在印度教孩子们用FFmpeg命令。

FFmpeg用C语言编写,C是最接近数学表达的编程语言之一。Kieran说C会像拉丁语一样:一千年后人们仍然能学习它、使用它。FFmpeg已经在火星上运行(NASA火星2020漫游车用它来压缩图片),是一个真正的多行星开源库。

核心归纳

Q1:FFmpeg和VLC为什么能存活20多年且至今没有竞争对手?
FFmpeg形成了赢家通吃的效应:每新增一个编解码器的支持,整个库的价值就增加,因为用户只需要一个工具就能处理所有格式。这种网络效应加上完全开源和极致的性能优化(大量手写汇编),使得无论是个人用户还是万亿美元公司都站在同一个技术栈上。VLC则靠"不信任输入"的哲学和拒绝商业妥协建立了用户信任,在2000年代其他播放器捆绑恶意软件的环境中脱颖而出。

Q2:为什么手写汇编在2026年仍然重要?
摩尔定律放缓意味着硬件性能不再自动翻倍,但视频分辨率从SD到4K HDR数据量增长了几十倍,AI推理对算力的需求还在指数增长。dav1d的案例表明,在关键路径上手写汇编比C快10到62倍,编译器的自动向量化完全无法弥合这个差距。当你的代码运行在30亿台设备上、每天解码数十亿小时视频时,每条指令省下的时钟周期乘以这个规模就是巨大的能源和成本节省。

Q3:大公司应该如何正确地与开源社区互动?
不要把公共bug追踪器当成企业工单系统,不要在志愿者面前标注"高优先级"然后期望免费响应。如果你依赖某个开源项目,签支持合同,雇佣或资助核心维护者,提交修复补丁而不只是提交问题报告。Google在FFmpeg安全报告争议后开始提交补丁和提供修复奖励,证明公开施压可以产生正向改变,但这种改变本不应该需要社交媒体上的公开冲突才能发生。

发布于 中国香港