FFmpeg:互联网视频背后的不可思议技术 | Lex Fridman Podcast #496

完整转录稿

YouTube Lex Fridman 2026-05-06 22:03

# FFmpeg:互联网视频背后的不可思议技术 | Lex Fridman Podcast #496

类型:字幕 语言:英语

我确信其他任何软件,比如 Adobe、Spotify,都会有联系人。但我没有,对吧?所以提高关注度是有效的。有时会非常辛辣,会有很多戏剧性。好吧,X 和 Twitter 很适合做这件事,而且确实有效。

这就是这个账号的意义所在。而且更进一步,如果你能通过这种方式教人们了解开源项目、汇编等等,我觉得这里有很多价值。它不是为了嘲讽而嘲讽。它真正展示出来的故事,我认为 X 学到的是:这些不是大型企业开源项目。这不是 Kubernetes,背后有几百人、也许几千人拿工资开发这些东西。这些只是一些人在地下室里利用业余时间做出来的东西。如果你能以一种有趣、好玩的方式讨论这个话题,我觉得这就是好事,也就是 X 的价值,以及我们现在能触达这么多人的价值。

这是最好的编程学校。如果你在 FFmpeg 里精通 C,如果你懂得怎么写汇编,我向你保证,即使你后来去写 TypeScript,也会成为最好的程序员之一,因为这是最了不起的事情。你会接受一些最老练程序员的 review,他们会查看你代码的每个部分,并告诉你为什么它还不够好。就像我们是你在编程上遇到过的最好的老师,对吧?

没有选择,否则你的视频就没了。而且由于编解码器的工作方式,如果你漏掉一帧,就会破坏视频的观感。所以你必须足够好。你必须完美,才能得到正确的结果。但还有一点,它不只是数学意义上的纯编程,对吧?

很多人不理解,要想在开源多媒体社区里正确编程,你需要理解计算机如何工作。写汇编时,你需要理解 CPU 流水线,对吧?你需要理解 SIMD 如何工作,ALU 如何工作,对吧?你需要理解 IO 如何工作,对吧?我认为这正是今天很多工程师和软件工程师缺少的东西,也就是我们所说的计算机体系结构。说真的,有些争论会是:我们应该用这个汇编调用还是那个?有人会说:“不,在这种 CPU 上它会是三个周期,而这个会……”这会对输出产生巨大影响,对吧?

我可以开一家咖啡馆,把它当作我的激情项目,但我得通过建筑规范,我得建一栋楼,我得找地点,我得做各种各样的事。而在软件世界里,那个激情项目可以快速移动,可以被网络效应放大,而且这种放大可以大于各部分之和。你可以找到对极其冷门的东西感兴趣的人,形成网络效应,做出真正了不起的东西。

所以我们都相互依赖。

他能够逆向工程极其复杂的编解码器。他做这件事,我和基兰也会做一点逆向工程,但显然远远不到这个水平。

你可以把三条操作打包到一行里加载。所以基本上,你每秒可以有大约六十亿次操作的输出,但总线,也就是内存总线,只允许十五亿,对吧?也就是说 CPU 快了四倍,所以你必须做一些疯狂的事情,把东西打包进内存,或者复用寄存器。这类语义没有任何语言能表达,对吧?我有那本 Itanium 编程书,因为 Intel 出过非常棒的书。但这正是基兰所说的:如果你不知道自己要做什么,它根本不可能读懂,对吧?里面全是大量行话等等。而这些课程很棒,是因为它们面向一个真实问题,而且你可以自己动手做。

所以这真的做得到。而且我相信,即使你不经常写汇编,理解汇编语言也是必要的,因为它能让你明白计算机内部发生了什么,这会让你成为更好的程序员。我可以向你保证,因为做这件事会让你理解计算机内部的一些内存架构,对吧?

理解寄存器、L1、L2、L3、RAM、SSD、磁盘等等,这些都非常重要。因为这样你会形成良好的编程素养,而这会让你成为更好的程序员。

然后我写出了有史以来最好的代码。六个月后,我自己也理解不了,对吧?因为读代码更难。所以你经常会来到一个地方,看不懂所有智慧、所有业务逻辑、当初这样做的原因,而这些原因也许没有文档。然后你说:“好吧,我要重写它。”但事实是,不,你不会的,对吧?

因为就像基兰说的:我要用 Rust 重写 coreutils。然后当然,你很快就做到 80%,再做到 90% 要多花一点时间,最后还剩那些尾巴,对吧?

另一方面,对新项目来说,它非常好。所有和解析文件、网络相关的东西,因为有内存检查器、边界检查器,Rust 很惊人,没有别的东西能做到。换个角度回答我们这里的问题:假设我拿 dav1d 或 x264 这样的软件,对吧?它有大量运行时间花在汇编上,对吧?

嗯,我把 C 部分用 Rust 重写,对吧?这样更安全。是的。但随后你进入汇编层,你可以跳到内存中的任何地方,因为我们写的是手写汇编。所以即使我为了安全把 C 部分用 Rust 重写,只要你写手写汇编,你就会破坏所有安全性,因为我们可以跳到任何地方。因此在我看来,我们需要做的是某种安全汇编,对吧?也就是在编译期检查汇编。这类似于我们在 dav1d 和 x264 里与 VideoLAN 一起做的 checkasm 项目:开始在编译期对你的汇编做插桩和检查,确认它没有跳到内存中的任意位置。否则,你可能用 Rust 重写了一部分 C,但如果你想获得同样的性能,你就会使用内联汇编,于是你摧毁了整个安全模型。这就是我对 Rust 的一点看法。

你们有 Henrik。Henrik 比我们更懂。”他知道几乎所有 CPU 世代上几乎所有 SIMD 指令的周期数。“哦,对,这是 P4,这是 Nehalem,这是 Core 2”,等等。这个人就像是世界上最懂汇编的人。而且他也是你见过的最友善的人,非常……他来了,你根本看不出他有多厉害。另一个人叫 Martin,Martin Storsjö。他们主要在 Arm 上做同样的事情,对吧?也就是 Neon,对吧?以及 iPhone、Android 等等。他会在手机上写汇编,用那种糟糕的虚拟键盘编辑,同时看着自己的孩子在游乐场玩,对吧?

这简直就是大师级。所以这两个人就像……

还有我们说过的 KHTML 到 WebKit,再到 Blink。嗯,这是同一个过程。还有,比如今天我想在 VLC 里做一个新功能,我会 fork,自己先做,然后再合并回社区。所以 FFmpeg 的开源社区里确实发生过一次分裂,变成了 Libav 和 FFmpeg。几年后,社区又合并回来,人们继续往前走。这有点像开源社区里正常会出现的戏剧性事件。但 fork 甚至……它们很重要,因为它们会改变一个社区的现状。这里不是在谈 FFmpeg 和 Libav,而是说 GCC 那个 fork 让 GCC 变好了很多,因为有些人想从根本上改变架构,让它更快。当然,这总是人与人之间的问题等等,但最终你会发现,今天的 FFmpeg 比 fork 之前更好。而现在,我们又都回到一起了,对吧?我在社区里花了很多时间,基兰也可以说说。老实讲,这件事通常没有被解释得很好,因为很多原因并不公开。但我觉得这是正常的,也是好的。

因此事实上,FFmpeg 变成了 Libav 的一个超集。这给了用户更多东西,因为归根结底,我们是为用户工作的:更多功能,以及许多曾经被讨论过的事情。比如关于 review 的争论,关于我们如何 push 的争论,现在在 FFmpeg 里已经完全稳定下来,并且基本遵循社区里大多数人认同的方式,对吧?所以事实上,所有曾经活跃在 Libav 的人都回到了 FFmpeg 工作,因为分歧被解决了。最终,FFmpeg 比过去更强了,对吧?而且……我知道人们喜欢戏剧性事件,但是,嗯……

归根结底,是因为你热爱它,它让你快乐。然后到了某个点,你醒来发现:“这场戏剧里的火力有点太猛了。”所以在项目层面,项目会继续,甚至经常会繁荣。但有时候,会有这些具体的人,他们只是……

返回该播客 打开原文