一声棒喝,本不立文字
偏要著録,已是二义

Lex Fridman Podcast

#496 – FFmpeg:互联网视频背后的关键技术

#496 – FFmpeg: The Incredible Technology Behind Video on the Internet

二〇二六年五月七日 收听原版播客

Lex Fridman 对话 VideoLAN 主席 Jean-Baptiste Kempf 与 FFmpeg contributor Kieran Cunha,讨论 FFmpeg/VLC 的 codec、container、demux、hardware acceleration、assembly 优化、open source license、项目治理、安全报告、归档、AV1/AV2 与低延迟 Kyber。

A

以下是一场关于 FFmpeg 和 VLC 的对话,嘉宾是 Jean-Baptiste Kempf 和 Kieran Cogna。FFmpeg 是一个开源软件系统,是 YouTube、Netflix、Chrome、VLC、Discord,以及基本上互联网上所有涉及视频或音频的平台背后那条看不见的主干。它几乎可以 decode、encode、transcode、stream 和播放任何曾经出现过的视频或音频格式。对我来说,它是有史以来最出色的软件系统之一,而且这一切都是志愿者完成的。VLC 同样是一款传奇软件。它是一个开源 media player,基本上你扔给它什么它都能播放,任何格式、任何平台、没有广告、没有 tracking。它的下载量已经超过 6 billion 次。对我来说,它也一直是我最喜欢的软件之一,而且有着最具传奇色彩的 logo。所以在这次对话里,我当然要全程戴着 VLC 交通锥帽向它致敬。再次,最重要的是,感谢那些了不起的志愿工程师,他们把心血投入到这些 code 中,而这些 code 被数十亿人使用和喜爱。谢谢你们。

A

也介绍一下本期我将对话的两位优秀工程师和可敬的人:Jean-Baptiste 是 VideoLAN 的主席,也是 VLC 和 FFmpeg 背后的关键人物。Kieran 是一位长期从事 codec 的工程师、FFmpeg contributor,也是如今在 Twitter/X 上那个相当有名的 FFmpeg 账号背后的人。我推荐大家都去关注这个账号,既是为了看 meme,也是为了看它毫不掩饰地赞美 open source 和优秀的 low-level software engineering。

A

我还想说一点:现代文明有如此多的部分建立在一些软件之上,而这些软件的作者并不追逐名声或金钱,而是痴迷于工程这门手艺;这件事既令人受到启发,也让人谦卑。我们生活在一个每天有数十亿人消费视频的世界里,却很少有人会想到视频底下那套看不见的机器。但那套机器很重要。Open source infrastructure 很重要。它是人类跨越国界、安静协作,构建有用、持久、优雅之物的伟大例子之一。它服务于我们所有人。所以这场对话不只是关于 codec 和 media pipeline,它也关乎一种更深层的工程精神和慷慨精神,正是这种精神让 FFmpeg 这样的项目成为可能。再次,我怎么感谢都不为过。谢谢。

A

现在简短提一下赞助商。你可以在简介里查看,也可以访问 lexfriedman.com/sponsors。实际上,这是支持本 podcast 的最好方式。Laradin 用于理解 AI 在你的业务中如何被使用;Blitzy 用于大型 codebase 中的 code generation;BetterHelp 用于 mental health;Finn 用于 customer service AI agents;Element 用于 electrolytes;Perplexity 用于由好奇心驱动的知识探索。朋友们,请明智选择。现在进入完整广告词。我会尽量让它们有意思,但如果你跳过,也请仍然看看这些赞助商。我喜欢他们的产品,也许你也会喜欢。无论出于什么原因想联系我,都可以访问 lexfriedman.com/contact。好了,开始吧。

A

本期节目由 Laradin 赞助。Laradin 是一个 platform,帮助组织了解 AI 在其业务中如何被使用,以及它对 productivity 和 performance 产生了什么影响。个人 developer 层面确实正在发生一场转变。很多人过去可能自己写 50%、40%、30% 的 code,其余由 AI 编写;而现在,他们转向所谓的 agentic engineering,基本上变成 0% 的 code 由手写完成。我们在个人 developer 身上已经能看到这一点。现在的问题是,当你把它扩展到 2、3、4、5、100 个 developer 时,会是什么样?从一家真正要 ship products、要协调团队,让他们一起构建和协作的公司角度来看,这会是什么样?AI 如何被用来提升 individual contributors 以及整个 team 的 productivity?这就是 Laradin 所做的事。如果 AI 已经是你组织的一部分,现在就是掌控它的时刻。访问 laradin.com 预约 demo,开始最大化 AI 的影响。

A

本期节目也由 Blitzy 赞助。Blitzy 是一个 AI-powered autonomous software development platform,专为大型复杂 codebase 构建。它使用大量协作 agents,真正针对巨大 codebase 做了优化,也针对大量 agents 协同工作时的 scaling speed 做了优化。这正是一个很有意思的大问题:当你有大量 agents、一家巨型公司、一个巨大 codebase 时,从整个 codebase 的大局来看,你如何让这个 codebase 持续增长、开发和演进,尤其是在其中很大一部分不断由 autonomous 方式处理的情况下?问题是,当你有一个已经能提供价值、已经能销售产品、已经拥有大量客户的大型 codebase 时,你如何使用 agentic engineering 继续增加功能、继续改进、继续进行常规开发,包括 testing、security 等等?你如何做到这一点,同时不把事情搞乱,不让你的 codebase 充满 AI slop,并且仍然在很大程度上自动完成?不是完全 autonomous,而是 semi-autonomous,但大部分 code 是 autonomously 编写的。这正是 Blitzy 专注的领域。autonomous software development 的未来已经到来。访问 blitzy.com/lex 了解更多,或与他们团队成员交流。网址是 blitzy.com/lex。

A

本期节目也由 BetterHelp 赞助,拼写是 H-E-L-P。现在从 AI 转向人。直到今天,从创造 intelligence 的角度看,人类心智仍然超出我们的理解范围。心智有太多复杂而精细的心理结构,而我认为这正是人类非常特别的原因。但这些复杂性也会以适得其反的方式纠缠在一起,因此需要被理清。我非常喜欢 talk therapy,把它看作一组工具,一种理清人类心智复杂性的 methodology。BetterHelp 是一种简单、私密、负担得起的方式。这也是我一直推荐它的原因。如果你还没有尝试过 talk therapy,它是迈出第一步的很好方式。你可以在 48 hours 内联系到持证的专业 therapist。BetterHelp 让这件事变得非常容易。访问 betterhelp.com/lex 查看,并在第一个月获得优惠。网址是 betterhelp.com/lex。

A

本期节目也由 Finn 赞助,Finn 是 customer service 领域排名第一的 AI agent。正如我前面提到人类时所说,人是复杂的,而 customer service 归根结底是面对每一个具体的人,并真正倾听。这也是我做 podcast 时努力去做的事。真正倾听每一个人,无论我们谈的是非常技术性的话题,还是关于 human condition 的大问题。有时,当你讨论某个技术话题的细节时,在其底层你能感到那些关于 human condition 的大问题的存在。所有这些复杂性都会从看似浅层的互动中显露出来。乍看之下,你可能会以为 customer service interaction 就只是那样,但实际上,我们是在试图解决 human condition 的重大问题,并且这些问题又具体到每一个 individual person。所以 customer service 是一个非常难的问题,但也是一个非常重要的问题。这正是 Finn 专注的领域:如何在 customer service 这项任务中 leverage、use、utilize AI。访问 finn.ai/lex 了解更多,了解如何转变你的 customer service,并扩展你的 support team。网址是 finn.ai/lex。

A

本期节目也由 Element 赞助,它是我每天喝的零糖、美味 electrolyte mix。我正在旅行,去到世界上一些地方;最初的感受和体验非常陌生,几乎到了让人不适的边缘。所有新事物都可能让人不适。而对我来说,从健康层面和心理层面,Element 都是一种舒适感的来源。它让我想起家。家是我最健康的地方,在那里一切都更有秩序。我每天锻炼、跑步,无论是 jiu-jitsu、跑步还是举重。我饮食很好,也经常 fasting。而所有这些都需要 Element 提供的 electrolytes:sodium、potassium、magnesium。说真的,如果 electrolytes 做对了,其他一切都会稍微容易一点。你不会头痛,也不会在 fasting 时产生那种奇怪的不适感。最喜欢的口味一如既往,我应该提一下,因为我真的很喜欢,是 watermelon salt。任意购买即可获得免费的 8-count sample pack。访问 drinkelement.com/lex 试试看。

A

这里是 Lex Fridman Podcast。若想支持本节目,请查看简介中的赞助商链接,那里也有联系我、提问、反馈等链接。现在,亲爱的朋友们,有请 Jean-Baptiste Kempf 和 Kieran Cunnigham。传说 VLC 什么都能打开。你知道它能打开的最奇怪的东西是什么?

B

有很多人在用 VLC 录制 VHS 视频,对吧?比如接上一块采集卡,基本上就能录制 VHS 视频。

A

这是怎么工作的?

B

基本上就是那种 capture card,可以接 Peritel 或 RCA,把它接上之后,VLC 实际上可以播放这类卡的输入,而且还有一个 module,可以直接控制某些 VCR camcorder。我们最近也支持了 DVD audio,对吧?整个夏天我们都在做 DVD audio support,而现在几乎没人再做 DVD audio support 了。里面还有自定义的 encryption scheme。

C

Lucasfilm 呢?

B

对。还有当然是各种奇怪的 codec support,FFmpeg 支持的 game codec。

C

有一个 Star Wars video game,第一个 10 秒的开场片段,有人专门实现了它,并确保它在某张曾经存在的光盘上、游戏里那一小段序列做到 bit exact。

B

有意思的是,在一次 VideoLAN conference 上,我们办过一个比赛:做出最奇怪、最糟糕的文件,然后看 VLC 能不能播放。

A

最后是什么?那个文件是什么?

B

是 Derek 做的一个 MKV file,每一帧都在改变 resolution、aspect ratio、rotation。然后问题是:能播吗?能。还有另一个,整个视频其实都是 animated subtitles,对吧?SSA。所以每一帧都是黑帧,但上面叠着一条每帧都在变化的 subtitle。

C

还有一个文件,好像同时是合法的 zip,也是合法的 MP3,或者类似的东西。

B

所以我们确实办过一个愚蠢文件比赛。

A

而且都能播。它打开了所有那些愚蠢文件。顺便说一句,给不熟悉的人说明一下,我现在戴着一顶帽子。说它是有史以来最好的最糟糕 logo,公平吗?那个 cone?

B

对,绝对是。VLC 的 logo 太有辨识度了。我们团队人数很少,但这个 icon 到处都有人认识。我去印度或中国很偏远的地方,人们也知道这个 cone。我们主网站大约 25% 的流量来自“Kun Player”这个搜索词。很多人其实不知道 VLC,他们知道的是 Kun Player。

A

他们在 Google 上搜的就是 Kun Player。

B

对,他们去 Google 输入 Kun Player,然后下载 VLC。所以这很有标志性。我们有一次还开玩笑说要换 logo,说会换成一种 caterpillar construction 的样子。那是在 4 月 1 日说的。结果我们收到了大约 10,000 封邮件,说不要换 logo 之类的。所以它确实太有标志性了,也很独特。如果你要做一个 video player,通常会在电视上放一个 play button,对吧?那就像 YouTube logo。这一个是原创的,是橙色的,很亮,而且很怪。

A

它很荒唐、很离谱,也很好笑。它会变成 meme,而 meme 会变成文化。

B

然后你会一直保留它,记得它。20 年后,你仍然会有这些 cone,并且记得:对,那是一个 video player。

A

对。我们还会谈到 FFmpeg 的使命,其中有一种 archival 的维度。所以你可以想象 1,000 年后,我们会有这些只有 VLC 能打开的视频。人类文明已经毁灭过很多次,最后剩下的只有这些东西:蟑螂到处爬,还有 VLC logo,以及一些 VLC 能打开的 archival footage。然后外星人出现,按下 play,就能看到这些内容。

B

我们确实希望如此。不过也有很多 meme,大家说:我相信我把一块 pancake 放进 DVD drive,VLC 也能播放。能吗?不能,我们试过,不行。但我们确实有一段视频记录我们尝试这件事。没有成功。

A

给物理现实做一个 codec?我都不知道那会是什么样子。

B

还真有人做过类似的事。他打印了一个小 cone,就像我们作为 goodies 发的那种。里面放了一个 RFID chip,用这种方式来播放电影。于是他把它放到 RFID player 上,一放上去,就会播放比如 The Last Star Wars 之类的电影。所以他不是摆一堆 DVD 盒子,而是到处放 VLC cone;你把那个接上,它就像一种 physical object。

A

我们今天要谈的是围绕 video codec、video encoding、video decoding、video streaming、video player client 的一切,也就是我戴在头上的东西,以及 enabling free media 的整个生态系统。我们会谈到 FFmpeg、VideoLAN、VLC,以及所有其他被数十亿人使用的 video technology。JB,你是传奇的 VLC player 背后的 lead developer。Kieran,除了很多其他身份之外,你是 Twitter 上传奇的 FFmpeg handle 背后的 lead developer。你们两位都有不少很直接的观点,可以这么说。所以今天我们想聊 FFmpeg 和 VLC。给不了解背景的人补充一下,我相信基本上每个听众都经常使用过这两项技术,只是可能不知道。FFmpeg 基本上支撑了互联网上大部分 video,包括 YouTube、Netflix、Chrome、Firefox,当然也包括 VLC,以及无数其他 video platform。据估计,线上和线下超过 90% 的 video processing workflow 都涉及 FFmpeg。VLC 至少被下载了 6.5 billion 次,但由于实际上很难统计,这个数字很可能还要高得多。几乎任何 operating system 都支持,几乎任何 media format 都支持;限制是它打不开 pancake。我们能不能先把一些基础讲清楚,帮助大家理解这里面涉及什么?当我们在像 VLC 这样的 video player 里按下 play 时,会发生什么?它是怎么从 file 或 stream 变成屏幕上的 pixel、扬声器里的 sound 的?有哪些大的阶段需要了解?

B

这里有几个阶段。第一个阶段,是从一个 address 开始,也就是某种 URL,得到一串 byte stream。比如 HTTP file、DVD。你给出 media 的 path,它就给你一串 data stream。

C

数据流需要由所谓的 container、demultiplexer 或 demux 来切分。我们会尽量少用术语,但这里确实需要开始标定 video frame 和 audio frame。它会从 operating system 按 block 获取数据,然后把这些 frame 切分成压缩数据。接着还需要对 video frame 做一些简单解析,主要是判断那个 codec 是否可以由 GPU 解码,还是需要回退到 software。我们很习惯假设 GPU 能播放所有这些东西,也就是会有 hardware acceleration。但我认为最多有 45% 的文件不能由 GPU 解码。所以这些都需要探测,需要检测。同一个 codec 可能存在不同变体,其中一些可以在 GPU 上解码。不同 GPU vendor 的能力也可能不同,因此也需要检测。如果它支持 GPU,就把它传给 GPU 这个 black box。如果需要 software fallback,那么一开始要先做 de-entropy coding,也就是去掉 bitstream 的数学编码。这会使用 Huffman coding 或 arithmetic coding 等能力,实际解压 bitstream 的数学层。然后我们需要开始读取 intra-prediction 的 syntax element。intra-prediction 就像 video 的静态图像,也就是 i-frame。它在 spatial domain 中工作和运行。你在 spatial domain 做 intra-prediction,会得到一个 residual,因为你的 prediction 和真实情况并不完全匹配。你做了一个 prediction,但还剩下一点差异,这就是所谓的 residual。它存储在 frequency domain 中,并且会被 quantized 以压缩其空间。然后我们需要做 inverse transform,把它们带回 spatial domain,并应用这些 residual。

A

所以 decoding 的很大一部分过程,就是这个东西本来是压缩过的。

C

是的。

A

然后你必须预测那里应该出现的最高质量内容。I-frame 是你在空间上拥有的最佳表示。

C

是的。

A

然后根据 codec 的不同,还可能发生大量 temporal compression。你是在预测以 raw 形式捕获到的现实应该是什么样子。

B

对,因为人们没有意识到 video 和 audio 的压缩是 100 倍级别的。大家没有意识到我们压缩得有多厉害。对于 audio,从普通 audio 到 MP3,压缩大约是 10 倍。到了 video,就需要 100 倍、200 倍。所以你必须去掉所有你并不在意的细节,因为我们做的所有压缩——这一点非常重要,但人们常常忘记——都是为了给人观看。所有 codec,无论是用于 audio,基本上都是在模拟你的耳朵如何工作,也就是耳朵响应中的很多特性;眼睛也是一样。所以比如在 video 中,我们并不使用 RGB。大家都以为会用 RGB,但并不是。我们会转到 YUV,其中一个是 luminance,也就是亮度,另外的是颜色。这和你的眼睛相匹配,因为你的眼睛里有 cones 和 rods,其中一些更多关注亮度,另一些更多关注颜色。我们需要大量压缩,因此必须降低质量。但为了降低质量,我们必须匹配 human perception。这就是为什么它这么难。然后我们还需要使用最大的数学能力,非常复杂的技术。像 Kieran 说的,我们会转到 frequency domain。我们做大量 dequantizing,以获得最佳压缩,但看起来仍然不错。

A

你们是在压缩,同时尽量最大化人类感知中的最高质量结果。

B

没错。正是如此。这一点非常重要。Compression 不像 zip。zip 是数据进来、数据出去,然后你用各种 zip compression 尽量接近极限。但这里我们是在 degradation signal。我们需要以尽可能好的方式 degradation audio 和 video signal。我们可以做到,但这首先涉及大量关于眼睛如何工作的理论知识,也涉及大量数学变换和数学技巧。比如,当你从 RGB 转到 YUV 时,我们经常做的一件事是,相对于亮度,把颜色的 resolution 降低。大多数时候,仅仅这样,在没有 compression 的情况下,大小就能减半,但大多数人看不出来。诸如此类。然后你会进入非常复杂的数学变换。当然有 Fourier transform,事实上它们并不是 Fourier transform,而是 discrete cosine transform,但思路相同。也就是 frequency domain,我们把 video 按 block 拆分。所以当 decoding 错了,或者 encoding 很差时,你会看到那些 block,等等,以达到非常高的 compression state。每一代 codec,在相同质量下大约都能再减少 30%。而这需要巨大的 computational power。

C

也许你应该展开一下。它是好 30%,但可能需要高一个数量级,甚至两个数量级的 compression power。这是很大的区别。

A

你说的 compression power 是什么意思?

C

抱歉,是为了达到那种 compression 水平所需的 CPU power。

A

明白。所以你必须能够利用 CPU,有时也要利用 GPU,就像你刚才提到的。我们还应该提到,这类 programming 很多都是在尽可能底层的 stack 完成的,不管是 C,当然还有一个著名 Twitter handle 反复强调的,大量 assembly。

B

整体上发生的是,你有一个 address,它通过 operating system 给你一串 byte,也就是一串 data。这是第一步。第二步是 demuxing,你会把 audio、video、subtitle 分离成不同类型的 track。然后对每一条 track,你会 decompress、decode,用 audio codec 处理 audio,用 video codec 处理 video,用 subtitle codec 处理 subtitle。等你把这些东西 decompress 之后,你就有了 raw image、raw 内容,然后你会和 screen 上的 graphic card 通信并显示出来。audio 也是一样,你会和 audio card 通信,然后它会以 analog 形式传到你的 speaker。

C

我们刚才几分钟里说到的所有内容,每一句话都是某些人一生的工作。每一句都可以写成书。很多情况下,复杂程度非常高。每一句背后都有整个行业里成千上万人在工作,也都有相关书籍。所以这里有很多细节、很多微妙之处,也同时存在 academic 和 practical 的现实,而两者都很重要。

A

我们提到了 codecs,但我觉得你还没有讲 containers。所以我们正在讨论的这些东西,实际的 containers 是什么?大家熟悉 MP4、MOV、MKV。那么,containers 和装在里面的东西分别是什么?

B

container 也就是我们所说的 muxer,对吧?我说 demuxing 的时候,意思就是 decontainerizing。实际上你看,mux 是 multiplexer,demux 是 demultiplexer,对吧?mux 和 demux 就是这些概念。同样,codec 其实是 coder decoder,对吧?所以 container 是多个 track 的集合。普通人会把它叫作文件格式,但它比这个说法更细一些。最常见的当然是 MP4。但我刚开始做的时候,是 AVI。AVI 是 Microsoft 的视频格式,而 MOV,M-O-V,后来变成 MP4,是 Apple 的格式。在 open source 社区里,有一位现在仍然活跃在 Videolan 的人叫 Steve Lorme,他发起了 Matroska 格式,这个格式更复杂一点,也更面向未来。还有很多其他格式。

A

这是一个很常见的情况,可能这次对话里也会发生:人们会把 container 和 codec 混在一起,对吧?比如把 MP4 和 H.264 混为一谈。这算是很严重的错误吗?

B

不算,因为从技术上说,H.264 的名字是 MPEG-4 Part 10,因为 MPEG-4 实际上是一个 meta-specification,里面包含好几类东西。它有 Part 2,也有 audio codecs。AAC 实际上可以说是 MP4 audio 之类的东西。MPEG-4 specification 里实际上有好几个 video codecs。其中一个就是 MPEG-4 Part 10,也叫 AVC,也叫 H.264。所以这完全是行业自己的问题,把事情搞得很难理解。于是人们就很难明白,为什么有时候你说 MPEG-4 Part 10,指的是 H.264,以及为什么它又不是 MP4。

A

所以从技术上讲,你可以把各种不同的 codecs 塞进 containers 里,而且可能塞得很糟糕。

C

但大体上说,MP4 通常会被理解为 H.264 加 AAC audio。99% 的情况下就是这两个。其他情况都很小,基本属于边缘效应。所以这也不是世界末日。确实有人会因此不高兴,但现实里,比如 VLC,顺便举个例子,文件可能写着 .mp4,但里面可能是完全不同的东西。这也是 FFmpeg 和 VLC 都面临的挑战之一:真实世界和一个 3 个字母的文件格式扩展名完全不是一回事。

B

这一点非常重要。比如在 VLC 和 FFmpeg 里,我们会丢开文件格式本身。我们会查看文件内部,理解里面到底有什么,因为很多人会说,哦,这是个视频,那一定是 .mp4,但技术上它可能是 .mov,或者可能是 .mkv。所以我们会实时分析手头的一切,不信任格式。

A

那么 .mp4 这个事实能给你什么信息?

B

它有帮助,给你一个提示。就像,哦,它以 .mp4 结尾,那我会先用 MP4 container demuxer 打开、probe 一下,看看它是不是应该是这个格式,但我不会完全信任它。如果我不确定,我会说,好吧,也许我试一下。所以它会提高这个 module 的优先级。

A

稍微岔开一点说,如果你尝试按 MP4 处理,但结果发现它是一个和预期不同的 codec,很多播放器就直接崩了。

B

是的。

C

是的。

A

那你们怎么做到不崩?从理念上讲,我相信一路上有很多容易踩的坑,很容易就崩掉、停止、报错,然后结束。VLC 怎么不会这样?

B

这就是 VLC 受欢迎的原因。但原因在于,VLC 最初其实只是一个叫 VideoLAN 的 streaming solution 的 client,那是很久以前的事了,大概是 90 年代末。当你播放通过 UDP 在网络上传输的视频时,它们可能是损坏的,对吧?所以你不能信任输入。在今天的安全语境里,这一点也非常重要:不要信任输入。因此,VLC 里的所有东西都准备好处理 broken files。这是从一开始就有的理念,整个工程也是围绕这个设计的。这是一种文化。比如,VLC 因此变得很流行,因为很久以前,当人们还在 pirating content 的时候——当然现在少多了。

A

而且我们谁都没有做过这种事。

B

当然没有。像 AVI 这类文件,用来播放的一些 metadata 在文件末尾。你在下载的时候,还拿不到那部分。所以 VLC 就会说,好吧,这个文件坏了,但我还是会尝试解释它。这非常有用。

A

我们已经提到了各个不同阶段的厉害之处,也提到了 codecs 的厉害之处,以及其中涉及的一切的深度、丰富性和复杂性。我们试着定义一下,什么是 video codec?里面包括什么?压缩某个东西是什么意思?你已经开始暗示了,但我们能不能展开一点?

C

[Speaker:JAKE ARCHIBALD] 任何视频里都有大量冗余,包括空间上的和时间上的。任何 video codec 的目标,就是去除这些冗余数据,并在这个削减过程中使用数学性质。通常情况下,压缩会使用高出好几个数量级的 compute,因为压缩的成本更高——无论是财务成本还是 CPU resources,相比 decompression 都更高。所以在这方面它是不对称的。很多时候是因为压缩只做一次,但同一个文件可能会有大量观看者。所以要把这些信息压缩 100x、200x,移除冗余信息,并利用数学性质把它变小,同时还要具备 error resilience 之类的性质。正如 JB 刚才说的,VLC 最初用于播放 UDP network feeds,而 UDP network feeds 会丢包。因此,codec 的一些设计目标也包括可恢复性。你需要能够加入一个 stream。它不一定是一个文件。你需要能够加入进去,进入 decoding process,然后开始 decoding。

B

为了让不熟悉的人更有画面感,比如你看任何类型的电影,镜头会 pan,会移动。你会发现,比如整个背景在一分钟或 30 秒内都是一样的。于是你可以复用背景里看到的那朵云,可以从一个 frame 复用到另一个 frame。这样一来,你拥有的 memory 越多,算力越强,就能做越多比较,也就能压缩得越多。大多数现代 codecs 基本都在做这件事。

A

我们再说得更明确一点:video 是什么?video 就是一堆 pixels,通常是 RGB,3 个值;你有一个 pixel 网格,每秒有比如 24、30 或 60 个 frames,然后所有这些 pixels 每秒重复并显示不同内容 30 次。所以问题,哲学上也是技术上的问题,就是我该如何压缩这一切?如何以 100x 的比例存储这些东西。

B

1,000x,对吧?

A

1,000x。

B

目标是 1,000x,对吧?

A

当你说 redundancy 时,目标是找到什么是冗余的,也就是那些最理想情况下,即使缺失了人类也不会注意到的东西。

B

举个例子,你有一张云的图片,对吧?到下一帧,它仍然会是同一朵云,所以这是冗余的。你可以只存一次,不再重复存,对吧?或者比如我身后是黑色背景,整张图里的黑色都是一样的。你就可以说,在这张图里,取左上角和右上角的像素。我不再给出具体数值,只告诉你它和左上角一样。然后对于第 1 帧,你还可以复用前一帧,或者再前一帧里的某些内容,以此类推。原则上这可以无限做下去,但实际上会受到 memory 或 compute power 的限制。比如,如果你需要在 4K 分辨率下比较过去 200 帧里的像素,那 compute 量会非常大。

A

然后在播放的时候,你还要把所有这些内容 decompress 出来。所以是 codec 同时负责 encoding 和 decoding 吗?你们开发的是一个耦合的过程吗?

B

没错。这其实是两个不同的取舍。你是要压缩得更多,但可能更难 decode?还是要做一个 encode 更复杂、decode 更容易的 codec?或者做一个更容易 encode 的 codec,因为你需要速度快,但 client 端的 player 要花更多时间?这就是为什么会有这么多不同类型的 codecs,因为这件事并不总是简单。更复杂的是,现代 codec,比如 AV1、AV2 或 VVC,实际上并不是单一的 codec。它们是一组 tools。也就是说,同一个 codec 里有多个 tools、多个 codecs,会根据图像内容选择更高的压缩率。

C

我补充一下,像 AV1、VVC 这样的 codec 面向的受众很广。内容可能是 screen share,也可能是 video,也可能是 animation。所有这些都需要不同的 coding tools。所以现在的做法是,把一组 tools 放在一起,称为 AV1、AV2 或 VVC,以支持不同 use cases。比如你在 Zoom 上分享 PowerPoint,然后又需要给观众播放一段 video。这个 codec 就需要根据内容改变自己的 toolset,用不同方式进行压缩。

A

就像你说的,背后有很多非常优秀的 engineers,在负责其中每一部分,也就是构成 AV1 的各个 tools。没错。我们前面其实已经绕着这个话题谈了不少,也谈到了 VLC、logo、那顶帽子。现在说说 FFmpeg。FFmpeg 到底是什么?

B

FFmpeg 基本上是 codec 的 low-level libraries,也就是 compression 和 decompression、muxers 和 demuxers,以及 filters。它的核心就是这些。然后还有几个 tools,可以让你创建某种 pipeline,用来处理任何类型的 video files。它作为 library 被用在几乎所有地方,从 VLC 到 Chrome,到 smart TVs,再到基本上你在网上看到的任何 video,通常都会用到 FFmpeg。FFmpeg 里面有所有这些类型的 tools,有时也依赖其他 libraries,比如 x264、libvpx 等等。所以它现在实际上已经是处理 images 的事实标准工具。

C

从哲学层面看,我觉得这很了不起:你的家庭录像、你祖母的家庭录像,以及 trillion-dollar corporations,实际上都在使用同一套 technology stack,站在一个相对平等的起点上。那些大公司使用 3,000 行的 FFmpeg commands,其实并不奇怪。有些公司用 API,但也有一些就是用很长的 command lines。

A

对,所以这里有很多 tools。比如字面意义上的 command line tool,FFmpeg,当然还有 FFprobe,还有 libraries,比如 libavcodec、libavformat、libavfilter。但 command line 里的 FFmpeg 简直是传奇,因为你可以剪切,有非常多 parameters,几乎可以把所有东西都定制到极致。

B

它是一种 language,是真正的 language。

A

是的,确实可以把它看成一种 programming language。

B

当然。大多数人会用 FFmpeg,指定 input file、output file,再指定 format,对吧?但我们见过几千个字符的命令,也见过有人通过编程生成 command lines 来使用 FFmpeg。现在有很多人用 AI 来生成 FFmpeg 的 command lines,因为你根本不知道那些参数是什么,但你可以指定非常多 filters,对吧?在 command line 里。FFmpeg 就是这样一套 multimedia processing 的 toolbox,所有人都在用。每个观看你 videos 的人其实也在用。你在 YouTube 上看内容,client side 用的就是 FFmpeg。你的 server side 也是;client side 可能是 Chrome,那你同样也在用 FFmpeg。你用 OBS 录制,也是 FFmpeg。你使用很多重要的、专业的大型设备时,也很可能在某个内部环节运行着 FFmpeg 的一部分。

A

举个例子,让大家有个概念。我在很多事情上都经常用 FFmpeg,哪怕只是很简单的东西,比如拿一段 video,加入 intro video 和 outro video,然后做一个 fade,让一个视频过渡到另一个。那叫什么来着?dip to black,就是画面暗下去再显示下一段 video,同时 audio 也做同样处理。有一个 audio 的 cross dissolve,先把声音压低,再重新变大。还有很多事情,比如把 captions 直接显示在画面上,也就是把 captions 烘进去。你可以定制 font,可以做各种 audio 和 video 的 layering。能做的事情太多了。当然,所有这些基本上都能神奇地适配任何 codec,不管 audio 端还是 video 端塞进来什么,它都能工作。

B

但如果你看,比如你可以在 FFmpeg 的 command line 里做一些原本会用 Adobe After Effects 做的事情。这很有意思,因为在 imaging 领域,并没有这样一个工具。也有一些工具,但没有 FFmpeg 这么广的覆盖面。

A

ImageMagick 有点类似这种——

B

是的,但你不会用它做某些 filters,尤其是 complex filters。你没有一个 command line 版 Photoshop 的等价物,对吧?但在 video 领域,你有 command line 里的 FFmpeg。

A

是的,这很了不起。我的意思是,它就是一个例子:一群很优秀的人聚在一起,有一个 vision,并且多年坚持这个 vision,这本身很难得。

B

VLC 和 FFmpeg 背后的 vision 是一样的:把对普通人、对所有人来说非常复杂的东西,做得容易使用。我们的目标是把技术上极其复杂的东西做成易用的工具。人们用 VLC,把一个 file 拖进去,他们不会意识到这个 file 有多复杂,但它就是能播放。或者人们把各种东西放进 FFmpeg,配上复杂 filters,它就像魔法一样能工作。这就是我们的使命:处理非常复杂的东西。

C

如果这需要传统 television studio setup,我们不会坐在这里,你也不会坐在这里。正是 FFmpeg 这样的 tools 推动了这种 democratization,推动了 podcast 和 streaming revolution、YouTube revolution。FFmpeg 是其中一个重要参与者,因为它让这项 technology 变得人人可用。比如在 90 年代,做 compression 需要价值数十万美元的设备,体积像一辆车。现在几乎每个人都在同一个起点上拥有这些能力。这一点很值得注意。

A

它让很多人有了发声的机会。顺便澄清一下,你刚才说“你不会在这里”,不是指我这个人,而是指这个 podcast。

C

不,抱歉,我说的是你作为——

A

VLC 在生物层面上并没有任何作用。按逻辑来说,是把我作为一个人创造出来。

B

你也会注意到,一切都在从 text 转向 images,再从 images 转向 video,对吧?看看 social networks。video 无处不在。它是现有最强大的媒介,对吧?当你看 Shorts、Reels 和 TikTok 的时候,就会明白 video 在这方面非常有力量,对吧?但其中的复杂性也很重要。

A

这是人们没有意识到的。我的意思是,这确实把力量交给了世界各地的个人。那才是真正的自由。我觉得难以置信的是,我们到现在还没有提到一个对不熟悉的人来说最显而易见的事情:它是 open source,背后有一个由用户和开发者组成的 open source community。所以它确实是一场 movement。我们会从很多不同角度谈到它背后的 community,但你能先谈谈 open source 这个元素吗?所以当我们说 FFmpeg 是什么时,它是一个 open source project。

B

是的,FFmpeg、VLC、x264、Videolan,我们做的一切都是完全 open source 的。对于不了解 open source 的人,我通常会用一个巧克力芝士蛋糕来打比方。通常,当你想买芝士蛋糕时,你去面包店,他们给你芝士蛋糕。另一种拥有芝士蛋糕的方式,是让你的奶奶给你一份制作它的 recipe。我们做 open source 时,会把巧克力蛋糕给你,也会把能够重新做出同样蛋糕的 recipe 给你;同时还会告诉你如何建造烤箱,以及你可以怎样修改 recipe,并把它转卖给别人。

A

对。

B

这是因为 software 本质上就是一份由很多小 instruction 组成的很长的 recipe。computers 并不聪明,它们只是运行得非常快。所以一个普通 program 有数百亿条 instruction,而你的巧克力 recipe 可能只有几十条。很大一部分 software industry 做的是销售 software,也就是只给你最终的芝士蛋糕。在 open source 里,我们把一切都给你。这样就让很多人能够一起工作,对吧?因为你决定要为 video 做出最好的 program、最好的 recipe,于是就形成了 communities。自 FFmpeg 一开始以来,可能已经有 2,000 到 3,000 人参与贡献,对吧?这和 Linux kernel 完全一样。Linux kernel 可能有 10,000 人在各处贡献,他们聚在一起,主要是在 online,对吧?也就是虚拟地聚在一起,为某件事创造最好的 tool。在 FFmpeg 和 VLC 里也是这样,比如这个 codec 不能用,那我就去修这个 codec,并把对这个 file 的支持加入 FFmpeg。这样所有人都会受益,因为我们是在为更大的公共利益工作。我们是在为所有人工作。这就是 open source。

A

我们也应该提到,取决于 licensing,你很可能可以围绕它构建一家十亿美元,甚至万亿美元级别的公司,基本上就是做一层 wrapper。

C

是的,确实有人这么做。

B

确实有人这么做。很多问题主要出在 cloud providers 身上,他们基本上是在 cloud 里运行一些 open source tools,然后只给你 API 来访问它。像 Mongo 或 Elastic 这样的很多 databases,为了避免这类场景,都修改了自己的 license。

C

这是我们在 FFmpeg 经常被问到的问题:为什么你们不这么做?答案是做不到。我们有成千上万的 contributors,其中一些人甚至已经不在人世了。要这么做,你需要获得他们所有人的同意。JB 也许后面会讲,在 VLC 中进行 relicensing 的过程有多么困难。

B

从 Rousseau 的角度看,license 实际上是 community 的 social contract。community 除了 license 之外,在很多事情上并没有共识。人们之所以围绕它参与、讨论,是因为 license。license 也允许出现 fork,对吧?有时 community 会分裂,但也正因为有 license,之后才有可能再 merge 回来。我们已经见过很多次了,对吧?GCC 和 GC、eGCC,过去的 W3C。比如所有 web browsers 也是这样,对吧?它们最开始是 KHTML,后来变成 WebKit,再后来变成 Blink。所以 open source license 是 community 的核心。人们来自世界各地,有非常不同的宗教、政治边界,却以同样的方式在一个 project 上工作,去解决一个具体问题。而我们正在解决的具体问题,是让 multimedia 对每个人都变得简单。

A

我在 Perplexity 上查了一下,看看不同的 open source licenses。大多数主要 open source licenses 分成两类:permissive,条件很少;以及 copyleft,对衍生作品有 share-alike 要求。下面是你会在实际使用中看到的主要 licenses 的简短实用总结。MIT license、BSD、ISC、Apache、GNU GPL、GNU AGPL。LGPL 在哪里?对,LGPL。再看看,还有 Mozilla Public License,还有 Eclipse Public License。列表还可以继续。有很多种。我想,真正流行的是 MIT、GPL、LGPL 和 BSD。BSD,Apache 有时也会被用来——

B

Apache 是大家比较理解的。

A

Unlicense 也是一种选择。它试图把 code 贡献到 public domain,并用一个宽松的 fallback license 兜底。

B

有很多 license 适用于很多不同的事情。人们不理解的是,public domain 并不是在全世界都存在的概念,对吧?所以所有 open source licensing 都使用 copyright law,也就是 international copyright law,来授予你如何使用 software 或如何修改它的 rights。它事实上是一种 copyright license contract,授予给 end user 或 developer。所以你会有第一类,基本上非常 permissive,比如 MIT、BSD。你给出 code,然后基本上别人想做什么都可以,对吧?拿走、修改、做任何想做的事。这在 JavaScript 和 BSD operating system 这类项目中很流行。

A

所以其中一个参数是它们是否要求 attribution,也就是说如果你使用了 code,就必须说明——

B

是的。在这类 permissive license 中,有些要求你在使用时声明,这叫 attribution;有些则不需要。然后还有另一类 license,也就是 copyleft,你需要把自己的 modifications 回馈给 community,并且带有不同的附加条件。有些是 weak copyleft license,比如 Mozilla Public License;有些更强一点,比如 GPL;还有非常强的,比如 AGPL。所以这些都是不同类型的 licensing,取决于你的目标是什么,以及你想如何组织你的 community。这也是为什么我说它是 social contract,因为理解这一点非常重要。FFmpeg 和 VLC 大多是 GPL 或 LGPL。Linux kernel 是 GPL,但 Android 是 Apache。大量正在使用的 JavaScript frameworks 大多是 MIT。所有 BSD kernels,比如 OpenBSD、NetBSD,当然都是 BSD。所以这基本上是在“你希望人们如何回馈贡献”这个问题上的哲学差异。

A

有一个问题——我想你谈过这个。你们曾经在 project 的某些部分从 GPL 转到 LGPL。你能描述一下两者之间的区别吗?以及要转到更 permissive 的方向需要什么?这个方向是更 permissive。LGPL 比 GPL 更 permissive。

B

是的。所以你需要意识到,license 总是可以从更宽松变得更不宽松,对吧?因为这些 license 本质上就是一种声明。所以如果你要限制,总是可以限制得更多,对吧?在一个 GPL 项目里,你可以使用 MIT 代码,但反过来不行,对吧?因为它们受到的约束更多,需要匹配。事实上,我曾经把 libvlc 的核心,也就是 VLC 的引擎,从 GPL 改成了 LGPL。这样做有两个原因。第一个是,人们可以把 VLC 引擎 libvlc 用到第三方应用里。所以你手机或平板上很多播放视频的应用,实际上里面都有 VLC 引擎,而它又会调用 FFmpeg。这也是我创办的其中一家公司的一种业务来源:做这类应用的咨询和集成,把 VLC 集成到第三方解决方案里,比如 game engine 里面之类。如果是 GPL,你就不能这么做,因为那意味着你需要把所有东西都 open source。而很多商业公司并不想这样。

A

所以用 LGPL 就可以创办一家公司,可以围绕它创办公司,可以做商业化的事情,而且不必把它 open source。这是很大的一步。

C

也就是说,你可以在游戏里播放视频。

B

是的。

C

问题是,如果我是 game developer,我想播放一些视频,但我不想仅仅为了播放这些视频,就被迫把整个游戏 open source。所以这就是咨询业务存在的地方,libvlc-lgpl 允许你这么做。LGPL,也就是过去所说的 library GPL,允许你这么做。

B

FFmpeg 也是完全一样的。一样。LGPL 强制你把你对这个组件、这个 library 所做的修改回馈出来,这也是它叫 Library GPL 的原因。所以你可以把 FFmpeg 以 LGPL 的方式用到任何类型的应用里,甚至是非 open source 的应用,但你需要回馈你对 FFmpeg 所做的修改。libvlc 也是一样。

A

从 open source 的角度看,选择 GPL 会不会有限制?因为如果你的 library、你的代码是 GPL,就意味着你基本上是在劝退那些想围绕它建立业务的公司,对吧?这样说公平吗?

B

这取决于公司。但如果一家公司的 business model 要求 source、应用必须是 closed source,那么是的,它会受限制。所以这也是为什么我当时改成 LGPL。第二个原因更隐晦一些:App Store,也就是 Apple 的 iOS App Store 的条款,让 GPL 应用上架变得非常复杂,而 LGPL 应用相对容易一些。所以 VLC 在 Windows、Mac 和 Linux 上是 GPL,核心是 LGPL,但在 iOS 上,iPhone 版和 Apple TV 版使用的是另一种 license,叫 MPL。是的,我去改了 license,这是一段很长的故事。

A

是的,所以我理解,基本上要修改 license,你必须联系所有贡献者。

B

是的。有一点非常重要:open source 项目在美国 copyright law 里被称为 joint work,在 civil law 里叫 collective works 或 collaborative works。也就是说,大家围绕同一个目标一起工作,最后形成一个软件,也就是一个 release。但 copyright 由所有个人保留。有些 open source 项目不是这样,它们强制做 copyright assignment,但我们不这么做。我们是 community。所以每个人基本上都对自己修改的部分拥有 copyright。即使最后你的 contribution 被删除了,这个 copyright 仍然存在,因为新的 contribution 是基于你之前的 contribution,对吧?所以如果你想正确地重新授权,就需要找到所有贡献者。那时候我必须联系 350 多个人。有时候,只有一个 email 地址,所以你需要真的追踪到人。我甚至真的去过一些地方,去找我在网上找到的人,到他们工作的地方说,你当时用这个 license 授权了,现在是否愿意从 GPL 改成 LGPL?大多数时候,他们甚至不太在意。他们只是想帮助 VLC。但这也让我遇到过非常复杂的情况。我到了一个人的工作地点,他是工厂工人。我说,我需要你签这个,因为真正写代码的是他的儿子,而他的儿子已经去世了,对吧?所以我必须解释这些 open source 的含义,说明我不是一家公司,不是想抢走那个孩子写的 2 行或 5 行代码;那些代码有用,而且整个 community 都同意这么做。他完全不知道这些事,他只是一个工厂工人。我当时也年轻得多,对吧?那是 14 年前,我几乎要哭出来。这非常困难,对吧?我们谈的是人的生活。我向他解释,然后我们还聊到了那个孩子的照片,对吧?所以以正确的方式、合规地做这件事很重要。但这确实意味着要追踪每一项贡献,因为每个 contribution 都有效。有些项目不尊重这一点,会比较强硬地重新授权。但正如我说的,那会毁掉 community 的核心,因为我们当初只是同意了这个 license,所以这很重要。

C

我想强调的是,community 是一个非常广泛的人群。有人在叙利亚战区,只能间歇性用电;也有来自各行各业的人,有富人、穷人、年轻人、老年人。所以能让这样一群人围绕某件事达成一致,是相当不容易的。这本身就是一种成就。

A

是的,这很了不起。而且他们很多人是 introvert。所以你去找他们,让他们回复一封 email,可能会相当困难。

B

我们大多数人都是 introvert,对吧?你得更精确一点。这里有极度 introvert、极其极其 introvert,以及 introvert,对吧?就是一个由不同人构成的完整 spectrum。没关系。重要的是,你的代码好吗?你的代码优秀吗?你的技术好吗?我们在意的是优秀的代码。我们不在意你是谁。抱歉,事实就是这样,我们也没有办法核查。我们核查不了,对吧?也许你是一条狗,我不在乎,对吧?我不在乎你来自哪里。我需要看你的代码。这很重要,因为很多人不理解这一点。他们来到 community,提交一些 patch,结果被拒绝了,然后他们不喜欢。因为我只能说,抱歉,它没有达到我们的标准。有人会说,是啊,可我是意大利、德国、美国某家大公司的 engineer。我们不在乎。我们在乎的是你的代码质量,因为这定义了我们的 community。这也意味着,有很多背景非常不同的人在贡献,他们也许很 introvert,当然,但这没问题,对吧?

A

community 里的一位传奇人物当然是 Linus Torvalds,他创建了 Linux,并长期维护 Linux kernel。传说中,在这种 meritocratic 的代码 review 流程里,他会相当严厉,会直接说代码不够好。你能谈谈 Linus Torvalds 这个传奇人物吗?

B

Linus 是很特别的人,对吧?我甚至会说,他在 Git 上做的事情,比他在 Linux kernel 上做的事情更有意思。他说话很严厉,但人们通常没有看到的是,他严厉对待的往往是 kernel 某一部分的 maintainer,对吧?所以他们认识他。他并不是对所有人都那样严厉。关键在于,他在自己房间里创造出来的东西,基本上支撑着线上每一台 server。即便是 Microsoft Cloud 也就是 Azure,我很确定 70-80% 的 server 都在跑 Linux。你们所有的 Android 手机也都在跑 Linux。他借助 open source 的力量做成的事,确实很了不起。而且是的,Linux kernel 的质量非常高。是的,这很难,但我们不能在这件事上妥协。我们不能在质量上妥协,因为到最后,你必须明白,VLC 的核心社区只有 5 个人。FFmpeg 的核心社区有 10 到 15 个人。而我们才是以后要维护你代码的人,对吧?因为时间线上有 1,000 个 contributor,最后只留下 10 个,也就是某个人来并留下来的概率只有 1%,1%。所以你会换工作、换妻子、有孩子、人生中遇到意外,你会换工作,等等,你大概率不会再回来。最可能的情况就是这样。所以将来维护你代码的是我们。它必须是可维护的。它必须是优秀的。是的,有时候这意味着你需要返工,因为它是好的,但还不够优秀。我们需要卓越,因为要由很少的人来维护对整体至关重要的东西。

A

但我们也应该提到,为了维持这种很高的卓越标准,有时候使用的语言会带一点火药味,会有些严厉。对此有什么可以说的吗?

B

这是真的。也因为比如我们做的是 low level 的东西,技术性极强。你进入这个社区后,语气会变得很像某种 subculture,对吧?所以从外部进来的人,基本上并不了解这个 subculture。FFmpeg 和 VLC 周围的大多数人,我们每年都会办 VideoLAN Dev Days,也就是 VDD。他们在线下其实非常有趣,也很喜欢这种氛围。但确实,在线上的时候,有时那种语气,你自己也意识不到听起来是什么样,不过这也还好。

A

这是一种文化。比如在 gaming culture 里也会看到这种情况。人们沟通的方式很严厉、很强烈。而且大家都明白,在不同社区里,表达喜爱和尊重的方式看起来就是不一样。有时候要看情况。如果是读书会,通常大家会温和得多。如果是一个 stakes 很高、被数百万人使用的 open source 项目,那就不一样。

B

但它很少会像你在 gaming 里看到的那种 insult,对吧?所以 Linus 的语气即便在 open source 社区里也有点不寻常。更像是对结果很严厉,说“不,这不行。这是垃圾。”你会看到的是这类话。

A

尽量不要针对人,而是针对代码。

B

是的。

C

这非常、非常就事论事。我觉得你必须从这个角度看:著名的 FFmpeg 几乎完全由 volunteer 开发,这是真的。你要想象,有人白天在自己的 day job 里辛苦工作了一整天,回到家里,语气简短可能就是会发生的事,这不应该被个人化解读。你累了,你很忙,但你仍然在乎这些 open source 的东西,只是你未必能在每一个细微细节上都解释清楚、手把手带别人。

B

而且你还要意识到,大多数人的母语不是 English。尤其是像 FFmpeg 和 VLC 这样的 open source 项目,它们主要以 Europe 为中心。有时候来自 US 的人,或者类似背景的人,会对语气非常不满意,但很多时候也只是因为他们不知道更好的表达方式,对吧?这很难。English 是一门很难的语言,有很多细微差别、语气等等,这些你不一定掌握。所以在这类社区里,不同文化和语言也常常会带来困难。

A

所以按照传说,JB,你一次又一次拒绝了数百万美元,就是为了让 VLC 保持 open source、对所有人免费、没有广告。请带我们了解一下这个决定背后的理由:为什么把几百万美元留在桌上不要?

B

是的,这在 Reddit 上几乎成了 meme,对吧?

A

Reddit 上真的有一个 meme。9GAG 上也有。对,我看到 Reddit 上有你戴着 VLC 帽子、看起来像 wizard 的图。上面写着:这是 JB,VLC media player 的创建者。他拒绝了数千万美元,为了让 VLC 保持无广告。感谢 Jean-Baptiste Kempf。甚至可以在 Reddit 上召唤他。

B

是的。通常你会看到,大家会 tag 我,对吧?然后我出现,说一句“早上好”,就拿到 24k upvotes,这很好,对吧?我的 Reddit karma 很不错,至少那个账号是这样。所以这个问题首先需要回答的是:VLC 的故事是什么,对吧?因为是的,这是真的。我拒绝了数千万美元。是的,不止一次。是的,我本可以成为 multimillionaire,在某个海滩上待着。但我没有这么做,因为我认为那不道德,也不是正确的事情。对我自己来说,这一点非常重要:我是在为更大的善而工作。我为人们工作,而且我不想……这不只是我一个人的事。另一个原因是,我也不觉得自己完全有资格那样做。让我解释一下为什么。VLC 的故事非常奇怪。在 France,我们有 university,也有一种顶尖 college。这些顶尖的精英学校包括 engineering school、business school,基本上还有 law 和 medical,对吧?但它们在 university 之外。为了进入这些学校,你要花 2 年疯狂学习,学 math、physics,才能考进最好的 engineering school。其中一所学校叫 École Centrale Paris。后来它改名了,但当时叫 École Centrale Paris。因为它在市中心,World War II 后地方太小,所以必须搬迁。他们想把它搬到 France 中部一个叫 Clermont-Ferrand 的地方。校友们认为这不行,对吧?这是 Eiffel 就读过的学校,也就是建 Eiffel Tower 的那个人,对吧?所以他们说,不,不,我们是很优秀的 grande école,不能这样做。于是他们在 Paris 南部、离 Paris 很近的地方买了一块地。那是一个由校友 nonprofit 管理的 campus。明白吗?正因为如此,campus 上的一切都由学生管理。学校什么都不管,对吧?radio、TV、supermarket、library、决定谁住哪个房间,所有事情都由学生管理。

A

这太有意思了。真是一个很棒的实验。它居然没有很快一团糟,反而以某种方式发展起来了。

B

效果很好。我这辈子也从这些课外活动中学到了很多。因为你才 22 岁,却要负责管理校园,否则就没有电可用,所以你自然会在意这些事。总之,在 80 年代,他们做了一次完整实验,部署了一套 network,主要由 IBM 和 3Com 赞助,是一个 token ring network。所以 token ring 现在大概几乎没人知道了。它是一种 networking technology,没有 routers。所有人都连接在一起,真的像一个环。当你想发送消息时,你把消息发给邻居,邻居再传给下一个人,下一个人再继续传下去。就 ring 而言,Token Ring 的问题当然是非常慢,因为 network 上的每台 computer 都需要打开消息,看它是否正常,是不是发给我的?不是。然后再把它传回去,就像一个 token 在环上循环。在 80 年代,大学里做一些 Telnet、发邮件,这还可以。但到了 90 年代,video games 开始出现。而在 video games 里,如果 latency 很高,基本上就会死。所以在 1994、1995 年,Doom 和 Duke Nukem 出现前后,他们想要一个更快的 network。于是学生去找学校,说,我们想要更快的 network,我们需要用它工作,当然也玩 video games。学校基本上告诉他们,抱歉,我们帮不了你们,因为你们知道,campus 不属于我们,是你们在管理,所以你们自己想办法。你们可以去找学校的一些 partners。于是他们就走了,真的去找了 Bouygues 的 CIO。Bouygues 是一家大型法国公司,在法国做电视业务。他说,这样吧,video 的未来是 satellite。今天我们知道并不是这样,但至少在 1995 年,这是一个不错的想法,当时刚有 satellite dish。他说,与其给 1,500 名学生每人配一个 satellite dish 和一个大 decoder,不如你们架一个巨大的 dish,只用一个 decoder,然后把 video 直接发到 network 上。这需要一个非常快的 network。今天看起来很显然,但在当时,这几乎是最早做 video streaming 的尝试。所以他们做了这个项目,叫 Network 2000。当然,那是在 90 年代,所有未来感的东西都叫 2000。

A

2000,是的。

B

于是他们做了 Network 2000 项目。它完全是 hack 出来的,45 秒后就会 crash。没关系,demo 只有 40 秒。它会 memory leak。也没关系,他们装了 64 megabytes 的 RAM,而当时一般只有 8 或 16。demo 本来应该到此为止。这就是学生们做的 Network 2000 项目。

A

他们当时要处理的 video format 是什么?

B

MPEG-2,因为 satellite 当时用的是 MPEG-2 TS 做 transport,video 是 MPEG-2 video,audio 是 MPEG-2 audio。项目本来应该到这里就结束。大家都很高兴。他们有了很厉害的 ATM network,速度是 155 megabits per second。在当时,他们大概拥有欧洲最好的 network 之一,然后他们停止了这个项目。6 个月或一年后,有 2 个学生来了,说,也许其他人也会关心 local network 上的 video streaming,于是他们创建了 VideoLAN 项目。VideoLAN。其中一个人叫 Christophe Maciot,是 Kieran 和我的好朋友,他们启动了这个项目。当时甚至还不是 open source。他们花了大约 3 年时间,才让学校同意把它做成 open source。当然,因为学校想从中获得一些东西,基于学生的 IP 和 copyright,基本上想把这些 MPEG-2 decoders 商业化。

A

我确认一下,所以主要的应用是什么?在 local network 上 streaming?

B

是在 local network 上 streaming。

A

顺便说一句,这有点像在强调显而易见的事:这是 YouTube 之前,这是在——

B

比 YouTube 早 10 年。你当时用的是 Pentium 60 或 75。主流机器是 33 MHz 的 486 DX。

C

要知道,当时 television 是 video 的主要形式。你可以收到新的频道。在 90 年代,如果你从小只有 4 个频道,那么哪怕多一个新频道,有第 5 个或第 6 个,都是很大的事。所以有这样一个 satellite service,能提供几十甚至上百个频道,是非常重要的变化。

B

尤其是因为这是一所大学,里面有很多不同国籍的人。所以有很多人想要——最后他们有了好几个 dish,对准不同类型的 satellites。比如,很多人来自 Maghreb 或 Middle East,所以他们会去接入不同类型的 satellites。总之,这个 solution 运作得很好,他们也开始了 VideoLAN 项目。VideoLAN 项目包含几个部分,有些 solution 完全疯狂,比如如何在 unicast network 上创建 multicast。不过我们先不讲这个,太复杂了。VideoLAN 的 client 部分后来变成了 VLC。事实上,他们基本上是强行推动学校开源,因为学校并不理解这一点。2001 年仍然算很早,但学校在 2001 年初同意把它做成 open source。我是在 2003 年加入这个项目的,因为那时我进入了这所大学。所以第一点是,创建 VLC 的人不是我,因为实际上没有某一个人创建了它。

A

它算是从 VideoLAN 项目中自然生长出来的。我们也应该提一下,虽然你已经说过,但为了说清楚,VideoLAN 是它后来的名字。当时它是一组围绕 video 的 technologies,而 VLC,也就是你说的 client,才是大多数普通用户认为的那个东西:你点击一个 video,它弹出来,然后播放。

B

我在 2003 年加入,然后创建了名为 Videolan 的 open-source nonprofit organization,并把所有东西从大学里迁出来,把它做成一个 nonprofit project,一个可持续的项目。确实,我在 VLC 和 Videolan 上花的时间比任何人都多,这一点是肯定的。但它是前一个项目 Videolan,也就是学生项目的延续;而学生项目又是 Network 2000 项目的延续;再往前也是如此。

A

我相信在这个过程中,你们一定有一些时刻会思考,从 open source 的角度看,它的未来是什么。因为随着 internet 爆发式发展,各类公司也出现了。对那些不记得的人来说,当时有一些公司赚了大量的钱。

B

我可以告诉你,在 2005 年,这个项目本来应该已经死掉了。是我让它继续了下去。有一段时间,我们只有 2 个活跃开发者。我觉得这项技术很好,也很有用,而且以后还会有用。于是我把我的人生和时间都投入进去。我让它从几十万用户、几百万用户,发展到今天的规模:现在全世界可能有数十亿个 VLC 版本,几乎到处都在使用。这大概就是 VLC 的故事。围绕它还有很多很有意思的故事。来自世界各地的许多人都在参与,就像你说的,有人在叙利亚,也有人在印度偏远地区。但在这个过程中,我收到过好几次邀约,要么是把 toolbar 捆绑进去,对吧?你们应该还记得那些糟糕的 toolbar,基本上就是 spyware;要么是修改你的 web browser 或 search engine;甚至是在 VLC 里加入 advertisement。我不喜欢这些。人们不理解,这并不是因为我反对钱。我很愿意赚钱。我创办过几家 startup,其中一家我希望能发展得很好。事实是,我相信赚钱必须符合伦理。有正确的方式,也有错误的方式。偷偷塞 advertisement 或窃取 data 不是正确方式。比如,如果 Netflix 在某个时候来找我们说,我们想把 Netflix 放进 VLC,也许故事就会不一样。但他们没有。来找我们的只有一些不太正当的广告公司。如果我那么做,我会赚到很多钱。然后 3 年后,项目就没了。有人 fork 它,事情就会走向别的方向。

A

所以问题不一定是 ads 或类似东西本身,而是其中的可疑和不诚实。你当时判断得很准,也有很好的底线:不,这会损害它本应代表的精神。

B

对我来说也是这样。很自私地说,我晚上要能上床睡觉,并且对自己做过的事感到安心。也许是我的成长环境,也许是我父母的影响,或者别的什么。但我相信有对和错。那在当时就是正确的决定。现在依然是。我想为自己所做的事感到骄傲。如果我出卖了它,我就背叛了很多其他人的工作。

A

是的,我应该说,我和互联网的大多数人都感谢你做了那个决定。我觉得这对其他推动 open source 运动的人也很有启发:如果你相信这是对的,做出这种巨大的牺牲也是可以的。对吧?而且我认为在那个案例里,它确实是对的。这也是 VLC 能取得成功的原因,因为它体现了一种东西,是 freedom 的象征,也是 open source community 能够创造什么的象征。

B

并且能服务世界各地这么多人。这很重要。

C

我们应该强调,在 2000 年代,下载一个程序然后它偷偷安装一些 spyware,是非常常见的。相关说明会藏在很淡的文字里,或者藏在底部没人读的 license 文本框里。比如,哦,我将安装这个 toolbar,并修改所有这些设置。那时你安装任何类型的程序来做一件事,经常都会遇到这种情况。

A

如果把自己代入那个时代开发者的心态,我觉得听这期节目的人很容易理解:在那个时候,说服自己拿几千美元去做这件事是很容易的。几千美元就可以了。而拒绝多得多的钱,需要胆量,也需要远见。

B

我收到的最后一个报价高得离谱。他们说,是啊,但想象一下,有了这么多钱,你可以做一个新的 open source 项目,对吧?这种心理诱导很厉害,也确实很难。但对我来说,我只是觉得,不,这不是这么运作的,或者说这不是正确的事。所以我不做。再说一次,不是我不喜欢钱或怎样。只是那不对。

A

好吧,我再次代表我自己,也代表互联网的其他人感谢你。我们再多聊一点 open source 运动。就像你反复说的,FFmpeg 以及许多 open source 项目都是由志愿者构建的。最近有一点风波,Kieran,在互联网上,在 Twitter 上。你在 Twitter 上的风格比较犀利,我觉得它很好地表达并赞扬了那些了不起的开发者、开发工作和 code,尤其是构建这些 codec、构建这些技术时涉及的 assembly。但这也带来了一个有点混乱的事件。请你完整讲讲和 Google security engineers 之间发生的事情。

C

先说明一下,Google 是 open source 最大的支持者之一,而且已经支持了很长时间。只是我觉得这次有些事情有点过头了。FFmpeg 本身,这也不是什么秘密,homepage 上就写着,它会处理 untrusted data。当你 parse untrusted data 时,可能出现 security issue,这是很正常的。但最近发生变化的是,Google 开始使用 AI 为一个 open source 项目 FFmpeg 生成 security report。志愿者必须处理这些问题。他们确实提供了非常有限的 funding,甚至在问题能够被修复之前,先去媒体那里宣布他们的 AI 有多好。

A

而且这是在公开论坛里。

C

是的。

A

也就是说,用 AI 在 code 里找到一个 issue,一个 security vulnerability,然后在你们能够修复它之前,就公开报告出来。

C

是的。他们是在宣布自己的 AI 有多好,说他们提供了行业标准的 90 天 deadline,但并没有真正理解志愿者驱动开发的性质。另外,这个 vulnerability 出现在一个很冷门的 1990 年代游戏 codec 里。我们先从他们的角度来看这件事。来吧。

A

好,你能帮我站在他们那边理解一下吗?

C

是的,当然。他们投入了大量资源来保障 open-source 项目的安全。这些项目无处不在,他们为此用了很多 compute,也请了非常昂贵、非常有能力的安全研究人员来做这件事。从他们的角度看,他们是在通过这种方式做贡献,但我认为分歧也正出在这里。可以说,这暴露出许多有意思的裂痕。安全社区里似乎有一部分人,把自己看得有点像不用去工地的建筑师。去工地,也就是实际的日常施工,在他们看来有点低于他们的身份。他们只负责做自己的安全工作,其他就是别人的问题。安全行业对很多事情的语气也相当强硬。他们使用的语言极具攻击性,会用很重的说法,比如“you will get popped”。对普通大众来说,“get popped”听起来是很糟糕的事;对他们来说,它只是指“被 hack”。我个人会把它看得有点像你家门上的挂锁。你家门上的挂锁,或者说你家的门锁,是按照它要防护的对象所需的能力来设计的。它不是用来保护核机密的,也不是用来保护 Fort Knox 的。现在的情况可以被理解为,他们用大规模 AI 去撬这些锁,然后说:“嘿,你的锁不安全,你得处理。”但实际上,有资源去修这些问题的正是他们。可是无论是以 patch 的形式,还是以资金的形式,他们似乎都不会贡献。AI 的规模也是问题所在:bug report 写得非常冗长,非常啰嗦,几乎像是 AI 生成的 bug report 对一些非常小众的 codec 造成 denial of service。安全社区的另一个问题是,所有东西都被标成 high priority。你会看到他们说,这是世界上最重要的事,你必须处理这个 high、high、high vulnerability,非常可怕,非常可怕,非常可怕,而它其实只是一个 1993 年某张光盘上使用的游戏 codec。

B

是的。

C

这就是矛盾所在。各位,到处告诉别人他们的挂锁不安全,可那可能只是某个人的 hobby project。那个 codec 的安全性,本来就取决于那个人怎么看待它。那是他的业余项目。对它做 security analysis 是好事,但不需要一个巨大的吓人警告,说这是 critical vulnerability。你们可能最近也看到过另一个所谓的“vulnerability”。这次不是 Google 的情况,而是某个 filter 可能溢出并出现 integer overflow,结果是你的某个 pixel 颜色可能错了。这个问题被标成 high,红色的 7.5 severity。到某个时候,安全行业需要意识到,不能一直这样狼来了,因为这只会导致人们采取相当于把密码贴纸贴在 PC 上的做法。你不能每天都喊狼来了。我理解,这就是他们的 modus operandi,也就是制造尽可能多的恐慌和害怕。但从 Google 的角度看,归根到底,他们需要以资金或 patch 的形式做贡献。Google 使用 FFmpeg 的规模,可能是你我都无法想象的,涉及数百万 CPU core。是的,他们会在一些领域做贡献,主要是跟自家产品有关的领域,比如 VP9、AV1,但从更广的角度看,贡献比例是不成比例的。是的,他们资助学生。是的,他们资助 Summer of Code。我想,Alex Strange 是前 FFmpeg developer,他应该是以个人身份发帖的。

A

他在 Hacker News 上发了一篇关于 security engineer 的帖子。他的帖子写道:一般来说,security report 的问题在于,安全人员都是失控的自我营销者。括号里写着,Linus 曾经用过更难听的话形容他们。想象一下,你是一个谦逊的 open source 志愿开发者。如果某个 security researcher 在你的代码里发现一个 bug,他们会给它起一个可爱的名字,建一个带 logo 的网站。Google 会给他们一百万美元 bounty。他们会去 DEF CON 领奖,而且我猜还会去参加某种秘密的安全人员 orgy,所有人都穿得像《The Matrix》里的人。但当你把它修好时,没有人会为你做这些事。基本上,他是在评论参与其中的不同人之间的 incentive,以及这些 incentive 是如何错位的。

B

这里的问题是,发现问题的手段和修复问题的手段之间严重不对称,对吧?这就是最大的问题。那次风波之后,Google 做了一些改变。

C

他们现在开始发送 patch 了,这—

B

他们现在也有了奖励修复 issue 的工具。所以因为那次风波,情况有所改变。这是好事,对吧?不过我们也看到过,虽然这里说的是 Google,但我们也见过其他一些大公司说,哦,你们必须修这个 bug,因为它在我们的产品里是 critical。

A

你能解释一下 XZ fiasco 吗?FFmpeg 的 tweet 写道:XZ fiasco 表明,对无偿志愿者的依赖可能造成重大问题。万亿美元公司期待志愿者提供免费且紧急的支持。Microsoft Teams 在一个满是志愿者的 bug tracker 上发帖说,他们的 issue 是 high priority。在他们礼貌地要求 Microsoft 签订一个用于长期维护的 support contract 之后,对方只提出一次性支付几千美元。他们说,这是不可接受的。我们没有编造。这就是 Microsoft Teams 实际做过的事。然后你们给出了图片和细节之类的东西,显示这些万亿美元公司并没有给多少钱,也没有提供多少支持。

C

他们以为 open source project 是传统 vendor,以为自己和它之间有 SLA。他们以为公开的 bug tracker 实际上是第三方 vendor 的 Jira,可以在里面做这些事情。但它不是。它是用来报告 bug 的。bug。我觉得让这件事尤其恶劣的是,他们点名了 Microsoft,点名说这是一个 visible product。如果这只是一个普通的 bug report,我觉得情况会好很多。

A

是的。所以他们真的说了类似这样的话:这件事很重要,因为 Microsoft 里有很多人在用它。我很好奇这里心理上发生了什么。所以我觉得这些公司里发生的事情,也许你可以纠正我,是他们确实把 FFmpeg 当成一个 vendor,而且认为 Microsoft 肯定向它支付了大量资金。他们在互动中默认了这一点,而整个流程中没有任何一个人说,等一下,我们是不是应该给 FFmpeg 几百万美元?

B

这是大型公司里的一个很大问题。我们现在说的是某些公司,但其实到处都一样,对吧?很多这类公司里,当我们和那个人沟通时,他只是 Microsoft Teams 某个项目里的 manager,对吧?他从来没有真正和 open source community 打过交道。他完全不知道,对吧?就是这样。但问题在于,通常这类公司里有我们所说的 OSPO,也就是 Open Source Program Office。它们本应负责和 open source vendor 或 open source community 沟通,但它们经常没有在内部正确解释这件事。这里的情况就是:我们不是你的 supplier。如果你希望我成为 supplier,我很乐意。我会给你发 contract 和 SLA。我围绕 open source project 创办过 5 家做这种事的公司。所以这没问题。

A

我们应该说一下,Kieran,你背后推动的一些火药味很重的 tweet,以及那场风波,确实产生了结果,而且是积极结果。

C

捐款已经大幅增加。虽然仍然不足以覆盖哪怕一名全职开发者的成本,但无论在认知层面还是技术层面,因为 X 以及发生的这些事,人们对 FFmpeg 的技术认知,以及对 FFmpeg 重要性的认识,都明显提高了。我可以说,它达到了目的。人们意识到了 FFmpeg 的重要程度。

B

视频领域也是一样,对吧?举个很简单的例子。我们有一年多无法在 Android 上更新 VLC,因为 Android Play Store 有一个 bug。我们唯一能让人回应的方式,就是发一条很“辣”的 tweet,说我们要停止分发 VLC for Android。我们大约有 1 亿人在使用它。之后 Android 的人真的来找我们沟通了。我们和 Microsoft 也遇到过同样的问题,我们说要停止在 Windows Store 分发 VLC。可惜的是,我们太小了,解决这些问题时唯一真正有力的手段,就是在社交网络上公开指责,因为事情会滚雪球一样扩散,然后他们才会听我们说话。但这些大公司往往很难和我们沟通。比如 VLC,很可能是 Windows 上使用量排名前 10 的软件之一。但我不是 Microsoft ISV programs 的成员,我在 Microsoft 没有对接人。我相信其他任何软件,比如 Adobe、Spotify,都会有对接人。但我没有。所以提高认知是有用的。有时会很激烈,很多 drama。X 和 Twitter 很适合做这件事,而且很有效。

A

所以正在听的人都应该去 Twitter、X 上关注 FFmpeg,去 Twitter、X 上关注 Videolan,去捐款,给 FFmpeg 捐款。

C

谢谢你,Lex。这些年来,你一直在 X 上支持 FFmpeg 和 Videolan,帮我们宣传,认可我们做的事。

A

FFmpeg for life。

B

比如 Tim Sweeney、Carmack,还有其他一些非常高层的人,也在我们的 X 账号上提高了大家的认知,这也帮了很多忙。

C

Karpathy。

B

Karpathy,是的。

C

Karpathy 也是。

A

是的。我想说,除了很多人在使用它、它对世界影响很大之外,它也是一个优秀 open source project 的很好代表。它体现了 assembly 和 C 的价值,也体现了在真实世界系统中认真对待 programming 的价值。

C

不只是这个。我们后面会谈 assembly,我相信那本身就是一个完整话题。但这也是在认可像 Andreas Reinhart 这样做 maintenance 的人。我相信这是无偿的,我认为他是志愿者。他在做大规模 refactoring,Andreas Reinhardt 和 Anton Kernov 在用 threading 重写 ffmpeg.c。我们要认可这些人,认可那些没人看见的劳动。从用户角度看,这些工作实际上没有改变任何东西。文件还是完全一样,但这就像飞机还在空中飞行时,已经被重新建造了一遍。

A

Christian Garcia 说:“作为一个运营这个账号的青少年”,指的是 FFmpeg 账号。你回复说,青少年在 FFmpeg 里写过的 assembly 比 Google engineers 还多。不过这也指出了,有很多很出色的贡献者其实是青少年。

C

就像 JB 说的,我们不在乎你是谁、来自哪里、做什么。多年来,青少年写了成千上万行 assembly。顺便向当年的 Daniel Kang 致意。也要强调像 Rukai Peng 这样的人所做的工作。这是一个 16 岁的人,他对 FFmpeg 的一些最早贡献,Winnipeg,实际上让某些所谓“security researchers”相形见绌,因为他真正找到了问题、修复了问题,而且他只有 16 岁。这里没有门槛。不是说你必须在大学里跟着某个人学习,理解这些东西。你可以学 C,老实说,就是从 K&R 那本书开始学 C。你也可以学 assembly。也许我们后面会谈到。你可以为世界级的技术做贡献。

B

在 VLC 里,最早期的贡献者之一叫 Félix。他负责 Mac 和 iOS 上的一切工作。他开始参与 VLC 的时候只有 16 岁。我们还有一个叫 Edward Wong 的人,以前是 Google Summer of Code 学生,后来在 VideoLAN 待了 3 年。他当时 14 岁。Google Summer of Code 和 Google Code-in 这些项目,基本上让我们有了学生和高中生,他们为 x264 和 VLC 写了大量 assembly,也为 FFmpeg 写了很多。所以每个人都可以贡献。

C

他做得也很好,因为他没有走那种危言耸听的 CVE 路线,没有去搞一个 CVE,也就是公开披露安全问题,然后做成那种很吓人的红色 7.5 优先级。他只是 3 天后在 Git 里修复了一个问题,就这么修了。他不需要围绕这个问题制造一场很大的 security drama。我想我当时发过,“the kids are all right”。有些情况确实存在,我不是说所有 security 人员都这样,但就像 Alex 说的,security community 里有一部分人喜欢通过制造 drama 来抬高自己。他们会很乐意把这说成是一个高优先级 CVE 8.0 或者类似的东西,但这个问题其实只存在于 Git 中。它甚至不在 release 里,还在 development 阶段。3 天后就修好了。

A

我也想表达一点善意,甚至是对更大的社区。向 Google engineers 表达很多爱和尊重。就像你说的,他们是世界上最优秀的一批 software engineers,也确实贡献很多,包括在 security 方面。而且我也很喜欢 Theo。向 Theo 表达善意。他也有点卷入了这次混乱和 drama。我觉得如果把视角拉远,放在人类历史的长弧上看,这场 drama 对所有相关的人都有正面作用。捐款上升了。它让这个话题获得更多关注,也让大家以一种争论的方式,最终弄清楚 FFmpeg 到底是什么。

C

我们看这件事的方式是,说到底它像一场 rap battle。不,但确实如此。我们说一些话,对方也说一些话。是的。但我们可以把它留在 X 上。那里很适合进行这种国际 rap battle。你说一些话,我也说一些关于你妈妈的话,但这并不意味着我真的和她有什么私人问题。

B

是的。

C

看起来就是这样。Theo 那件事,JB 也许可以展开说说,确实有点走得太远了,也有一点……但这就是一点乐子。就是一点 rap battle。像 WWE 一样,大家在 X 上找点乐子。不必太当真。那个青少年的说法,那个人是 Google 员工,他说:“嘿,运营 open source business 还有别的方式。”然后我们就回了。拜托,放轻松一点。这个账号的意义就在这里。另外,如果你能通过这种方式让人了解 open source projects、assembly 等等,我觉得这里有很多价值。它不是为了踩人而踩人。它实际上展示了一个故事,我认为 X 也学到了:这些不是大型企业 open source projects。不是 Kubernetes 那种,有数百甚至数千人拿工资开发这些东西。这些只是一些人在地下室里,用自己的业余时间做出来的。如果你能用一种有趣、好玩的方式讨论这个话题,我认为这就是好事。这也是 X 的价值,以及我们触达能力的价值。

B

说实话,即便在 Google 也是这样。Google 是一个实体,但里面有很多不同的人。我们一直和许多 Google 工程师合作。即便从 YouTube 到 Chrome,再到 Chrome Media,以及 Google 的其他部分,它们也都是非常不同的实体。我们的做法是有效的。比如 Theo 那件事,确实有点走得太远了。我让大家冷静下来,也和他通了电话。我们说,好,这样有点过头了,等等。但最终,虽然像一场 rap battle,它对项目是正面的。过去 2 年,我们在 open source 上的认知度大幅提升,我指的是来自社区的真正 open source,而不是别的。这是有用的。

A

你觉得我们一直在谈的这些出色贡献者,他们的动力是什么?背后的引擎是什么?这真的很有意思。就像你说的,他们坐在地下室里。驱动力是什么?

B

驱动力有很多,但有点奇怪的是,最主要的一个,是我们在 multimedia 领域做的事情是在播放视频,而视频很酷。比如,社区里有很多人最初加入,是因为他们喜欢看 anime。这也是别人问我“我该在 open source 里做什么?我该怎么开始?”时,我给的建议。我的回答总是一样:做你热爱的东西。我做 VLC,是因为我喜欢电影。我喜欢一遍又一遍看同一部电影,尽管我妻子会因此讨厌我。但这是因为它有意思,因为这是你喜欢的话题。通常来说,这是人们来到 VLC 和 FFmpeg 的第一层原因。第二层原因是,从技术上讲,因为我们追求卓越,这里是最好的学校。这是最好的编程学校。如果你在 FFmpeg 里擅长 C,如果你知道怎么写 assembly,那你很可能会成为最优秀的程序员之一。哪怕你后来做的是写 TypeScript,因为这仍然是最了不起的训练。你会不得不接受一些最资深程序员的 review,他们会看你代码的每一个部分,并告诉你为什么它还不够好。我们就像是你在编程上遇到过的最好的老师。

C

Andrew Kelly 创建了 Zig。他曾经是 FFmpeg developer,是经历了 FFmpeg 这所学校之后才开始做 Zig 的。我的意思是,这里能让你学习真实世界编程的很多方面,而且是在一个被数十亿人使用的东西里学习。你无处可躲。你必须开放、诚实地面对自己的缺点,知道自己如何学习、如何变得更好。

B

multimedia 里还有一点很有意思:你只有 16 milliseconds 来显示一帧。它不像 game engine,你基本上可以放慢一点,等一帧。所以你必须做得好,没有别的选择,否则视频就播不出来。而且因为 codecs 的机制,如果你漏掉一帧,就会破坏视频的观感。所以你必须做得好。你必须做到完美,才能得到正确的结果。但它也不只是数学意义上的纯编程。很多人不理解,在 open source multimedia community 里要正确编程,你需要理解计算机是如何工作的。写 assembly 的时候,你需要理解 CPU pipelining;你需要理解 SIMD 如何工作,ALU 如何工作;你需要理解 I/O 如何工作。我认为今天很多工程师和 software engineers 缺少的,正是对我们所说的 computer architecture 的理解。说真的,有些讨论会是:我们应该用这个 assembly call,还是那个?然后有人会说,不行,在这种 CPU 上它会是 3 cycles,而另一个会怎样。它会对输出产生很大影响。

C

我们可以展开一下。FFmpeg 可能是全世界最大的 CPU 用户之一。就在我们说话的此刻,它很可能正在运行,轻松达到 100 million 这个数量级,甚至可能是 1 billion 个 CPU。所以每一条 instruction 都很重要。至少从 CPU 角度看,我们做的每件事影响都非常大。

B

所以,一开始你来,是因为这个主题有意思;然后你留下来,是因为它追求卓越;最后,你会为它感到非常自豪,因为它在每个人的终端上。很多人会说,哦,我在某某咨询公司工作,做一个给 PG&E 下载发票的 portal。哇,很好。很多工作都是这样的。你不会拿这件事去告诉你奶奶。但如果你去见奶奶,说我做的东西让你能在 laptop 上播放视频,她能理解。这很重要。因为你在做 VLC、FFmpeg、x264。它最终会到达数亿人手里,你产生了影响。所以你可以为自己感到自豪。我认为,除了它能让简历很好看之外,这些都是人们贡献的原因。

C

是的,那些都是副作用。我最喜欢的关于这个话题的一句话来自 John Collinson。他说,世界是一座 passion projects 的博物馆。外面的一切都是 passion project,而 open source multimedia,以及一般意义上的 open source,能让你快得多地做到这一点。它有快得多的 network effect。我可以开一家咖啡馆,那也可以是我的 passion project,但我必须拿到 building codes,要建一栋楼,要找到东西,要找地点,要做各种各样的事。而在 software world 里,这个 passion project 可以快速推进,可以被 network effect 放大。而这种放大可以超过各部分之和。你可以找到对极其冷门的东西感兴趣的人,形成 network effect,做出真正出色的东西。

A

说到 passion projects,Tim Sweeney 其实在回复一条称赞 JB 的 tweet 时说过一句话,quote,“世界上很多事情之所以会发生,只是因为某个很棒的人决定去做。VLC 就是这样。”这对我来说指向了一件很有意思的事:在 software world 里,少数人,有时甚至一个人,似乎就能创造出很了不起的东西。就像你反复说的,我觉得 JavaScript 就是一个最初由一个人创造出来的很了不起的东西。有些 programming languages,比如 Python、C 和 Java,就是这个人有一个 vision,有一个 design,然后把它带出来,有时最初的火花就是一个周末。

B

是的。Linus 用 2 周做出了 Git。是啊,很厉害。

A

它改变了世界。我的意思是,它真的改变了世界。

C

Linus 的 passion project 就像是:嘿,我把这个 tarball 上传到 FTP 了,你们自己看着办。

B

但对我来说,这不只是 software 里的事。我相信会有 individual 改变世界。而且就像你说的,要有好的 vision。我想做这件事。它有用。它会有用。不管是建火车、汽车、火箭,还是别的什么,我相信那些相信自己并且有 vision 的人,能够对人类产生巨大影响。

A

我们先拉远一点,再拉回来。我们就继续在 stack 上上下下地看。所以我们一直在来回谈 VLC 和 FFmpeg。Kieran,你说过 FFmpeg 和 VideoLAN VLC 是共存的,没有一个中心化的重要点。你称它为 binary star system。

B

是的。

A

它们因为彼此而成功。你能解释一下区别吗?它们是怎么互动的?它们是竞争对手吗?

C

我不认为它们是竞争者。简单说,或者在我展开之前先给一个简短答案:VLC 之于 FFmpeg,就像 Android 之于 Linux。它们彼此依赖,也因为彼此而共存。我之前用的类比是,它们是一个双星系统。

A

顺便说一句,我最近才知道 Alpha Centauri,也就是离我们最近的恒星系统,是一个三星系统,这让我觉得很惭愧。

B

而当你开始做物理计算时,那就是一场噩梦,对吧。

A

但也正因此有了 three-body problem。

C

总之,很多 FFmpeg pipeline 都涉及 x264 项目,而 x264 是一个 Videolan 项目。我大致估计一下,可能 80% 以上的这些 pipeline 都依赖某个 Videolan 项目。VLC 显然也是我们已经讨论过的 Videolan 项目,它使用 FFmpeg,给 FFmpeg 带来了触达面,让它接触到各种奇怪文件;历史上还用一些捐款资助过 FFmpeg 开发。后面我们也许会聊一些 reverse engineering。所以它是一个双星系统。它们互相协作、互相滋养。很多开发者也是共享的。没有一个中心位置。这是一个共同运转的良性循环。

A

我们也应该提一下,x264 是 H.264 video standard 的 encoder。所以 H.264 是标准。

B

是的。

C

x264 是这个标准的 implementation,一个 open source implementation。这个标准基本上被所有人用于各种场景。

A

对,这正是推动这一切的主要力量。

C

当你想到一个包含 H.264 codec 的 MP4 文件,如果它来自软件环境,比如 data center 或其他地方,那么它很可能是用 x264 创建的。

A

而这是在 Videoland 旗下的项目。

C

这是一个 Videoland 项目。所以在 Videoland 的图里,它属于 Videoland 世界。

A

Videoland 里面还有很多东西。去 Videolan 网站看看,上面有很多图标。

B

如果你看一下,会发现有非常多 libraries,对吧?

A

LibDVD CSS、LibDVD Nav、LibDVD PSI、LibVLC,当然还有 VLC Unity、LibBlueRay。对。

B

而且还有很多。最近我们可能会聊到的 David 项目,是 Videolan 最新的项目之一,它无处不在。最近我们还宣布了 libspatialaudio。我们有 CheckISM,这是一个很夸张但很棒的项目。所以 x264 也是这些 VideoLAN 项目之一。在我看来,比如说,x264 是有史以来设计得最出色的 encoder。这也帮助了 FFmpeg 的采用。很多人和大型公司开始使用 FFmpeg,是因为他们想使用 x264;x264 提升了 FFmpeg 的流行度。同时 VLC 也因为能播放很多由 FFmpeg 生成的文件而变得流行。所以很多项目是相互交织、共同工作的。

C

是的。可惜在 X 上有一种说法,只要提到 VLC,就有人马上提醒说,真正干活的是里面的 FFmpeg。就像我说的,事实不是这样。我们是在一起工作。

B

给你一个概念:当我为 Windows 编译 VLC 时,我大概要编译 1600 万行代码。其中 100 万行在 VLC repository 里,而 FFmpeg 总共大概是 200 万行左右。这意味着很多 dependencies 都在外部。而且如果你单看 FFmpeg 本身,FFmpeg 也在集成 third-party libraries,比如 x264、libopus,以及许多其他库。它们彼此都互相依赖。

A

对,这也是我希望做这一期节目的原因,我们现在就是把 FFmpeg 和 VLC 放在一起讲,因为它们确实是同一套生态中的两部分。就像你说的,是双星系统,而我们都在围绕它运行。我们能不能顺带提一下这一路上的一些人?我们还没有真正讲 FFmpeg 的历史。也许你能说说 Fabrice?说说 Michael Niedermayer?再说说这里的一些关键人物?

C

我们可以按 FFmpeg 的几个时代来讲,因为有一些关键时期和关键人物让这一切成为可能。你提到的 Fabrice Bellard,他创造了这个概念。然后大概在 2000s,我会把那个时代称为 FFmpeg 的 Michael Niedermayer 时代。他完成的关键工作包括,当时对 DivX 和 Xvid 的全面支持,以及各种被称为 MPEG-4 Part 2 的奇怪变体。所以这早于我们现在熟悉的 MPEG-4 Part 10。那是 2000s 的 video codecs,当时有一种又一种非常奇怪的 decoder。2000s 时,你几乎需要一个新的 player 来播放每一种不同的 file format。Windows Media Player 用来播放 Windows media formats,RealPlayer 用来播放 RealMedia formats。那时 FFmpeg 的另一个关键点,就是为这些格式提供 native decoders。我还记得自己十几岁的时候,应该是在弄明白有这么一个 player,可以在不安装那些臃肿播放器的情况下 decode 这些文件。因为当时你下载 RealPlayer,里面会带很多其他东西,很多广告,还有各种杂物。拥有一个简单且快速的 library,促成了这种变化。然后我认为 2008 年以及之后是一个很大的转变,因为那时 H.264 走向成熟。我希望我们后面能多聊一点,这也是 high-definition video 的开端。H.264 是其中关键的 decoder。所以我会把那段称为 2000s 后期和 2010s。也是在那时,一批重要的 reverse engineers 出现了,并完成了非常出色的工作。最开始,一个不需要 codec packs、不需要下载带奇怪广告和奇怪 spyware 的东西,就能播放 Xvid、DivX、Windows Media 和 RealPlayer 的单一 player,本身已经是巨大的成就。

B

VLC 1.0 就是在那个时期发布的,2009、2010 年左右。也就是那时它真正爆发了。

A

对,不需要 codec packs,它就能在这些不同格式之间直接工作。

B

实际上,那些 codec packs 基本上就是 VLC 里的 FFmpeg,再加上我们用于各种 codec 类型的其他 modules。

C

但在当时情况不是这样。2000s 有各种奇怪的 codec packs,DLL 从这个地方来、从那个地方来,里面有 spyware,还有各种乱七八糟的东西。它们并不可靠,你也不知道里面是什么。拥有一个 open source 的单一 player,或者一个 single playback module/player,可以完成这些事情,这很重要。但我想强调的是,Michael 在 2000s 做的这件事简直像 Sisyphus 的任务。edge cases 的数量多到难以理解。比如你可能有一个中国的 CCTV system,它用了 MPEG-4 Part 2 的某个奇怪变体,也就是所谓 MPEG-4 ASP 的一个奇怪变体;你必须修好它,同时不能把其他所有人的东西搞坏,而这样的情况要乘以一百万。

A

所以你说的就是很多 reverse engineering 发生的地方。

C

它在 2000s 从 Windows Media 相关工作开始,因为那是 proprietary 的。也从 RealMedia 开始,有 Benjamin Larsen、Kostya Shishkov。Shishkov 那个时代,他们是关键人物,那是关键基础。然后到了 2010s,大概就是 Pormahol、Kostya 的时代,他们构建并处理了一些最困难的 codecs。JB 也许可以讲讲 GoToMeeting 4 和 GoToMeeting 5。

A

什么?GoToMeeting 是什么?

B

我们来谈谈这位很厉害的乌克兰人 Kostya。当时他住在德国,而且很喜欢 Sweden。这个人非常聪明,社区里很多人都很聪明,而他属于接近天才的那种。他能够 reverse engineer 极其复杂的 codec。他确实做到了。我们也和 Kieran 做一些工程工作,但显然不在这个层级。他 reverse-engineer 的是 binary blob,有 20 megabytes?

C

对,给个参考:reverse-engineer 一个 1-megabyte 的 binary blob,大概就是一个月量级的工作。而这个人在做 20、30-megabyte 的 blob。也许我们一会儿可以谈谈这件事的细节,以及到底怎么做。但他做的是非常困难、非常冷门的 codec。

B

而且他是为了好玩才做的。GoToMeeting 曾经是 VLC 的一个大问题,因为很长一段时间里,这大概是头号 feature request。我挂了一个 bounty。后来有一天他说,好的,JB,我来做。两个月之内他就做出来了,然后还解释了他是怎么做的。他说得很轻松,比如“我看这段 code 像是我以前在 WMV 里见过的 DCT”之类的。他就这样完成了。最有意思的是,他写的 code 里有大量笑话。里面有很多关于 JB,也就是我的名字、Kempf,还有 Kostya 的笑话。Kudi 写得很漂亮。

A

我想补充一点:我有机会和一些 developer、一些做 assembly language 层面工作的人聊过,他们总是把一切说得好像挺容易的。这里有一种谦逊,可能是因为做这些事所需要的水平太高了,所以相比之下,其他事情都显得容易。我想这大概是可以从中得到的一个结论。

B

在这个社区里,最让人佩服的一些人,就是做 reverse engineering 的,以及那些写 assembly 的人。这两类人都很出色。比如 x264 之所以后来非常强,很大程度上是因为一个叫 Loren Merritt 的人,他好像来自 University of Washington。

C

当时是的。

B

他让一切都变得很好、很快,写了大量 assembly。可以说那是一个黄金时代,很多事情都在那时完成了。

C

以 Kostya 为例,他看待世界的方式就是 binary specification。他不需要 documentation,也不需要别的东西。他会说,我有一个 binary,我就能把这一切弄明白。他经常用“binary specification”这个说法。意思是,这不是问题。然后他离开一阵子,回来时就做出一些有意思的东西。

A

你能不能具体讲讲 reverse engineer 一个 block 需要什么?补充一些细节和背景?

C

可以。以 GoToMeeting 为例,这是个很好的例子。比如我在 GoToMeeting 上录了一场 meeting。我怎样在不需要 GoToMeeting player 的情况下播放它?甚至可能根本没有 player。也可能我需要把一段 meeting recording 发给某个没有 player 的人。首先,里面还有大量其他东西。你需要去找到实际的视频会议 client。

B

这可能很容易。

C

也可能并不容易找到真正负责 decompression 的 module。对于 compression,你需要一种方法把 YUV data 从 module 里 dump 出来。所以通常这会涉及用 disassembler 打开它,尝试猜测 hook 在哪里,才能把那个 module 接进来,并原生运行这个 module 去 decode 一个 sample file。也就是说,要弄清楚这个 module 在哪里执行 decoding process,并找到一种方式 hook 进去,输出 raw YUV data,因为当你真正做 reverse engineering 时,需要用它作为对照点。你需要做到 bit exact,或者在某些情况下接近 bit exact。然后你打开 disassembler,靠大量直觉去判断:DCT 在哪里,entropy coding 在哪里。这里没有严格的 rule book,但总会有某种 pattern。比如 GoToMeeting,它很大程度上会是 screen codec,而且还有不同 variant。

B

我记得通常会有 GoToMeeting 4、5、2、3、4,好像是 2、3、4。对。

A

就像你刚才提到的,我查 Perplexity,GoToMeeting 对较早的 recorded sessions 使用自己的 proprietary codec,历史上存储在 WMV files 中,需要特殊的 decoder 才能在 Windows 上正常播放。如果没有安装这个 decoder,Windows Media Player 和一些 editor 无法 decode video tracks。所以你可能只能听到音频,或者看到黑屏。天哪,我太记得这种情况了。而你们做的就是 reverse engineering 这个东西。

B

这点很关键。因为 GoToMeeting 现在已经不是很多人知道的东西了。大家知道 Zoom、Teams 等等。但我们快进 10 年、15 年来看,这就是一个 Windows 32 bits 的 GoToMeeting.exe。你会说,可我在 Android 上,我在 iPad 上,我在别的地方。那你要怎么做?我可能在 RISC-V、arm 上。这些都被挡住了,但未来我们还需要支持大量文件。这就是为什么这类工作对人类特别有用。

A

不过我必须说,那个 reverse engineering process 真的让人难以置信。太疯狂了。它有点像……我最近读了很多采访 archaeologist 的内容。你手里的 signal 太少了。当然,随着时间推移,你会积累很多经验,你理解原始 code 的结构,所以可以开始推断一些基本东西。但你就像 archaeologist 拿着一把小刷子,试图重建整个人类文明。

B

Kieran 太谦虚了,其实 Kieran 也做过一些 reverse engineering。

C

做过 Cineform,当时是的。

A

Cineform,不错。

C

对,当时做的,后来其实也促成了那项工作的 open sourcing。在做 binary 这一侧的同时,你显然也会有一些 samples。很多情况下,samples 并不多。所以你必须弄清楚所有不同 flavor。比如 Cineform 其实是那个 codec 内部一组不同 approach 和 toolkit 的集合,因为它通常是自然演化出来的。难点在于找到一个 sample,让你可以从某个地方开始,而不是一上来就必须实现另外 10 个不同东西。所以先从那里开始。幸运的是,当时我纯属偶然找到了一个 sample。里面有很多 flat blocks,是 animation。所以这帮了很大忙,因为它没有使用特别复杂的 coding tools 等等。你可以先推进到某个程度,然后一点点往上搭,直到你发现,这里还有几个 bits,我漏掉了这个、漏掉了那个、漏掉了它会走的这个 if branch,然后才意识到问题所在。

A

所以我们说 samples,指的是 sample videos。然后你在 tracking,试图通过观察 sample,再看 machine code,去推断这个 codec 到底在做什么。

C

machine code 会说,这个 byte 是 6,走这个 branch。然后换另一个 sample。

A

这太离谱了,真的太离谱了。

B

你看,这已经很离谱了。然后你再去看 GoToMeeting,那就是……

C

我做的那个算容易的,对吧?

B

想象一下复杂度再高两个数量级。一个人独自在德国某处做这件事。而且很长一段时间里,你都在一个 black box 里工作,因为 decoder 有太多步骤,从 entropy decoding、intra prediction、motion prediction、IDCT 等等,在很长时间里你什么都看不到。所以你完全是在 memory 里 debug。

C

调试时经常是在猜。存放系数的 buffer 可能完全不对。于是你可能一路钻进死胡同,以为问题在这里,结果发现根本不是,是别的地方。

B

而且你是在几十 MB、几百万条指令的 binaries 上做这些,对吧?

C

所以你就在 debugger 里一步一步走,一条指令一条指令地看:这条 instruction 改了这个,那条做了那个。

B

在 CPU 层面暂停程序。

C

对,在 CPU 层面暂停它,观察发生了什么,试着搞清楚。

B

有时候你还得在 VM 里,这样才能暂停 VM。

C

对,暂停 VM,dump memory,因为有些 codecs 可能有 encryption,上面可能有 DRM。所以你需要从 virtual machine 里 dump memory。

B

我 2003 年进 École Centrale Paris 的时候,Jon Lesh-Johansson 基本上破解了 DVD specification,并向我们展示他如何破解 Apple 的 MP4 FairPlay DRM。他当时就在自己的 laptop 上做这件事。我那时很年轻,21 岁,真的很震撼,因为他基本上是在某种 VM 里调试 Windows。

A

这很厉害,也很有启发性。根据你的经验,以及你在 community 里看到的情况,这件事会让人沮丧吗?

C

会有人帮你,人们会给你发 samples,大家也很热心。有时候你拿不到 encoder,这就更难了,因为你只能去问,去要 samples。我记得 Videolan 有一段时间会在 Twitter 上要 samples:我需要这个很冷门的 sample。

B

很长一段时间我都是:我需要这个 codec,我需要那个 codec。

C

如果你很幸运,就能找到一些;如果不走运,要么什么都没有,要么只有一两个。有时候你会发现一个金矿。比如有人说:我们公司有 100,000 个这种 files,因为某些原因我们过去依赖它。那种情况最好,因为他们可以在大量 coding tools 上测试 bit exactness(比特精确性)。

A

你能解释一下 bit exactness 吗?

C

Bit exactness。大多数 video codecs,不是全部,但大约从 2000 年代之后开始,都有 bit exact 的定义。也就是说,每个 implementation 都必须产生完全相同的 bits。decoder 输出的数据必须逐 bit 完全一致。

A

是针对大量 samples 吗?

C

是针对给定的 sample。也就是说,Lex 的 H.264 implementation、JB 的 implementation,以及我的 implementation,必须 bit exact 地匹配。90 年代的 MPEG-2 并不是这样。可以说,这可能是 video industry 犯过的最大错误之一。我想 1992 年在场的人——我怀疑那时我们俩大概还穿着尿布——也承认了这一点。我想提一下 Yuriy Resnick,他也承认那是那个时代的大错误之一。

A

你是说 encoders 需要能够跑测试,然后验证 bit exactness。这确实是一个很好的保证。这里和 web browser 的工作方式有点平行:browser 接收 HTML 并显示出来,但不同 engines 之间并没有 bit exactness。

C

我想指出,FFmpeg 其实很特别,因为它已经变成了 winner-takes-all 的局面。你说 browsers 是个很好的类比,因为它也必须 parse 很多不同 content,并以特定方式 render 出来,就像 decoder 一样。但 browser engines 仍然有多个,比如 Firefox 的 engine、Chrome 的 engine,还有一些相当不错的日本 engines。multimedia 领域总体上,在很大范围的 codecs 上并不是这样。某种意义上,FFmpeg 算是赢下了全部。因为每加入一个新的 codec,它带来的价值其实超过这个 codec 本身的价值,因为它让整个系统变得更好。

A

这真的很酷。我查一下 Perplexity,Yuri Reznik 是 multimedia 和 signal processing researcher,在 Kyiv University 获得 computer science PhD,发表过 150 多篇论文,拥有 80 多项已授权的 US patents,参与过主要 multimedia standards,包括 H.264、MPEG-4、AVC、H.265、MPEG-4 ALS、G718。

C

G718 是 telco 相关的东西。

A

所以他和公司联系更紧密。

B

RealAudio、RealVideo,对吧?那在当时非常重要。

A

Xencoder、Brightcove、Contax。看来我得找 Yuri 多聊聊。他是正经厉害的人。

B

而且他是那种特别好的人。比如我现在在做的 startup 叫 Kyber。我认识 Yuri,是因为每年在 Denver 的 Mile High Video conference 都会见到他。他给了我很多很好的想法和建议。他真的是很棒的人。

C

他会跟我们说,能认识我们是多么好。我就想,看他的经历,Yuri,我觉得应该反过来才对。

A

这让我想起你跟我提过的 FATE testing,以及 FFmpeg 中所有合入内容所使用的极其严格的流程。你能带我过一遍测试流程吗?

C

可以。FFmpeg 有一个叫 FATE 的系统,FFmpeg Automated Testing Environment。因为 FFmpeg 运行在非常多不同的 OS 上,也可以用非常多不同的 compilers 编译,所以 configuration 的数量非常夸张。你能看到各种 compiler variants、operating system variants、instruction sets 的离谱组合。页面顶部可以看到 macOS 有大量 variants,因为它还有 iOS、tvOS。

A

我在看一个页面,fate.ffmpeg.org,81 分钟前、76 分钟前,可以看到不同 architectures、operating system、不同 compilers、Apple、Clang version,各种组合。这里说这些都是由 volunteers 运行的。

C

对,这些全都是 volunteer systems。比如顶部的一些是我放在办公室里 host 的,host 了各种不同的东西。其他人也 host 其他系统。它真正的作用是确保稳定,因为 FFmpeg 有相当复杂的 C code,比如确实会出现 miscompilations。也就是说 compiler 有时候会把 C code 编译错。这种情况偶尔会发生。

A

这里还有所有 compilations 的 log。

C

对,所有 compilations、所有 tests 的 log。我想另一个页面会显示所有 tests passing。

B

点进去就能看到所有 tests。Test back。All tests successful。

C

在 logs test 里,对。你可以看到所有这些 tests 都通过了,覆盖所有不同 codecs、所有不同 filter transformations,全部都在里面。各种组合的规模相当夸张。到这个程度已经不只是一个 matrix 了,更像是不同组合的 pivot table。

A

太夸张了。

C

这是我们工作中的关键部分。你可能能在本地测试某个东西,做一个改动,但实际上它会破坏 Mac 上的 GCC version 11,之类的情况,然后你就能修掉。我们还会遇到 miscompilation,也就是 C code 有时会因为 compiler 的 bug 生成错误输出。这有时会对 video 产生很大影响,因为 frames 之间有依赖关系。输出里哪怕一个很小的变化,也可能级联成很大的 glitch。

B

你能看到 PowerPC、RISC、ARM。

C

以前还有 RISC,还有一些奇怪的东西,比如 DEC Alpha。

B

还能看到 Visual Studio、不同版本的 GNOME、OpenSUSE。

C

Visual Studio、Intel compiler、Apple client,等等都有。

A

你们遇到过哪些痛点?比如有没有什么情绪触发点,或者说会让你做噩梦的某个 operating system,某个 container 和 codec 的组合?

C

对我来说,这个问题很容易回答。因为我有一份日常工作,我创办的公司做的是用于体育赛事转播的设备,比如在电视台、体育场和演播室之间传输信号。我们必须处理 10-bit video,而 10-bit video 有一系列挑战:CPU 不能原生处理 10-bit data。所以你必须把它放进 16 bits 里,这就意味着有 6 bits 被浪费了。于是就会有不同的 packing format,用来更高效地打包数据,因为当你通过网络发送这些数据时,必须节省那 40%。比如在 PCI Express 上,你可能只有那么多 bus bandwidth 可用。所以我想我们内部大概有一个矩阵,其中有些是行业格式,有些是我们自家硬件的内部格式。我记得是一个 5x5 或 6x6 的矩阵,覆盖每一种格式到其他每一种格式的转换。事实上,其中一个我发给过你,它们全都是手写 assembly。都是 assembly 写的,而且都支持不同的 CPU 世代。所以处理这么多组合,再乘以各种情况,确实很折磨人。

A

顺便说一下,你说的公司是 Open Broadcast Systems。

C

对,和免费的 OBS streaming service 没有关系。

A

明白。

C

但从广义上说,JB 和我创办的公司都围绕 FFmpeg、VLC 的理念展开。这是非常底层的工作。所以在大多数公司里,这类代码不会用 assembly 写。大家会默认 C 已经很快了。但从这个例子你也能看到,C 并不快。

A

这里写的是比 C 快 62 倍。

C

对。所以这就是把底层编程、实时编程的理念,用到商业应用里。JB 和我围绕这一点创办了公司,很多时候也会从开源社区招聘开发者,把这种理念带进来。这就是我们在做的一些事情的很好例子。在大多数公司里,可能就是“我用 C 写,够快了,结束”。但实际上你还能做得好得多。

B

对我来说,我们的一些头痛问题来自某些很难支持的 OS。你看 VLC,得益于 FATE 和 FFmpeg,最新版 VLC 可以运行在 Windows XP 上,而且现在仍然能跑,也能运行在 Windows 11 上。我们支持从 macOS 10.7 到最新的 macOS,不管现在是多少,26。我们从 iOS 9 开始支持 iOS,现在其实已经到 iOS 26 了。我们支持很多类型的 Linux、BSD、Solaris。最新版甚至还能跑在 OS/2 上。全世界可能只有 10 个 OS/2 用户,其中一个还在维护 VLC。然后你就会意识到,VLC 周围这个很小的团队,使用 FFmpeg codecs 和其他组件,支持的 OS 比 Microsoft、Google 或 Apple 还多,而它们拥有几乎无限的能力和资源。比如最糟糕的是 iOS。为了在 iOS 9 上构建,我们需要非常巧妙地混合多个版本的 Apple Xcode IDE 和 SDK,把几个版本拼成一种 Frankenstein 版本,这样才能继续支持 iOS 9。Apple 的 compiler 已经完全不支持它了,但我们还要让 ARM32 在 iOS 9 上运行。你在 FATE 上也看到过,它仍然支持 iOS 9。所以我的头痛主要来自支持这么多 OS。这很重要,因为我们收到很多人的反馈,说谢谢,我还有一台 iPad 2 用来看电影,它还停在 iOS 9,但还能用。这也关系到一个影响:不要在硬件明明还能正常工作时强迫人们购买新硬件。只要正确优化,它就能工作得很好。这也把我们带回刚才说的 assembly。它也是在对抗一种趋势:你被不断要求买新东西,但其实本可以通过更多优化来延长使用寿命,而这已经成了一门失落的技艺。

A

你得给我讲讲这门失落的技艺,或者说这些 assembly 火种的传承者。什么是 assembly?为什么它有美感?为什么它有挑战?它是怎么工作的?

C

写 assembly code 时,你直接使用实际 processor 所用的 instructions。大多数时候,你会用某种语言来写,比如以 C 为例,compiler 会根据你的 C code 为你生成 assembly language 和 machine code instructions。我们在 FFmpeg 中使用一种特定类型的 assembly,叫 SIMD,single instruction multiple data。意思是,比如我想给一个数字加 5,在 scalar assembly 里,这是对单个元素操作。比如我有数字 10,想加 5。我使用 add instruction,把 5 加到 10 上,得到 15。而用 SIMD,我可以有一个包含 16 个不同数字的完整 vector,这些数字都可以不同。如果我想都加 5,可以运行一条 instruction,这一条 instruction 会对全部 16 个元素求和。你可以想象,这非常适合 video。Video 是 pixel grid,所以我可以同时对多个 pixel 执行操作。FFmpeg 的关键区别在于,我们不会在它上面使用任何 abstraction,或者说不会使用重度 abstraction。另一个方向会使用所谓 intrinsics。这些是 C functions,行为和手写 assembly 很接近,但并不完全一样。CPU 上用于存储 data 的 registers 会由 compiler 为你分配。所以理解这一点很关键:当我们写 SIMD 时,可以获得 10x 到 50x 的速度提升,不是百分比,是 10 倍到 50 倍。那个 function 是 62x。

A

这太夸张了。

C

你也知道,FFmpeg 账号经常发帖和发推讲这些,就是想说:我们在做这些事。

A

你是能看到 assembly 之美的人,但它对这类应用也极其实用,甚至能显著超过 C,这确实很疯狂。

B

这是必要的。

C

是的。

B

对吧?比如有一个我们需要谈到的项目,叫 David。David 是一个 decoder,用于 Alliance for Open Media 制定的格式,也就是一个叫 AV1 的 video decoder。

A

给不了解的人补充一下,我们刚才一直在讲 H.264。AV1 是另一个非常流行的 standard 和 codec,并且正在越来越多地接管互联网视频。

B

当这个格式推出时,很多人都说,尤其甚至包括 Alliance for Open Media 的人,也就是 Google、Netflix、Amazon、Mozilla,他们说,这个格式太复杂了,decoding 必须用 hardware 来做。然后我和另外几个人加入进来,主要是 Ronald、Henrik 和 Martin。我们说,必须有一个极其优秀的 software decoder,因为 hardware 普及需要时间。所以我们写了这个项目,它的规模非常夸张。我们说的不是 30,000 行 C,而是 240,000 行手写 assembly。

A

手写 assembly,240,000 行。这太厉害了。我们现在谈到的一些东西,可能已经是最大的 assembly code base 之一了。

B

给你一个概念,Kieran 可以纠正我,但我认为 FFmpeg 为所有 codec 写了 100,000 行 assembly。是所有 codec。而仅这一个就有 240,000 行。当然,这是一个 VideoLAN project,并且已经做到了最大程度的优化,因为我们启动这个项目时的口号是“every cycle matters”,对吧?每一个 cycle 都很重要,因为 dav1d 被用于 VLC,也被用于一些软件 AV1 playback stack。我们说的可能是 30 亿台设备,它们会不停地 decode video,因为比如说,Netflix 现在 30% 的视频都是 AV1。YouTube 可能有 50%,对吧?而且你通常没有 hardware decoder,因为拥有 hardware decoder 的设备并不多。通过 dav1d,我们发现只用一两个 core 就能正确 decode 720p。所以这确实很不可思议,对吧?

C

David,看看这个。

A

是的。这是你发的另一条很有火药味的 tweet。它说,peak video codec 应该是这样的:79.9% assembly,19.6% C,0.5% other。

B

不可思议的是,这些 tweet 讲的是事实,但人们会很激动。他们不高兴,对吧?

C

他们会说,是啊,过去 2 年他们都很激动。不,Intrinsics 没问题。compiler 会——

B

他们会说,你们不能优化 compiler。auto-vectorization 的问题是你们的错。你们不懂。我们已经试过很多年了。结束了,对吧?

C

2 年过去了,2 年后我们展示了几百个 handwritten assembly 的例子。他们还是说,不不不,是你们做错了。compiler 可以做到。

A

所以我们其实应该把这件事说得更清楚一点。软件工程师的直觉是,当你有一段代码,比如我们举个例子,C++,会有一个 compiler 做大量优化。

B

是的。

A

他们的预设是,如果你有足够好的 compiler,如果你持续改进 compiler,它就会生成性能接近 optimal performance 的代码。你不可能击败它。而你们一直在挑战这种想法,认为如果你做——

C

handcrafted assembly 可以以数量级的差距超过 C,是数量级的差距。

B

他们告诉我们的两件事是:是啊,但现代 compiler 有 auto-vectorization,对吧?因为我们做的 SIMD 就是 vectorization。但这根本不是一个量级,对吧?完全不是。不是慢 5%、10% 那种,而是慢好几倍。

A

所以我不知道你们能不能从哲学层面说一下,因为有很多优秀的软件工程师、优秀的工程师、优秀的 machine learning 人员。Karpathy 会听这期节目,他会想,这里面他应该得到什么直觉?我们应该——

C

顺便说一下,Karpathy 是因为那些 tweet 学了 assembly。他看到之后说,哦,我觉得这是 assembly。让我弄清楚这里发生了什么。你也知道他记录自己工作的方式。

B

从哲学层面看,重要的是要意识到,hardware 速度飞速提升的时代已经过去了,对吧?我们处在 Moore's Law 的末期,在 AI、memory 等方面都有限制。你需要往 stack 更底层走,做更多优化,才能从现有资源里榨出更多能力。因为我们对算力、CPU power、GPU power 的需求正在爆炸式增长,而 hardware 的速度并没有同样爆炸式增长,对吧?所以人们会增加更多 core,对吧?但这基本上意味着,到某个时候你可能会有 250 个 core,对吧?而我们做的是利用机器的每一寸能力。

C

不只是这样,不只是这样,我们是在“滥用”机器。我们会用创建者没有预料到的方式使用机器。有时我们会用一条和我们要做的事完全无关的 instruction。比如在 video processing 里用 cryptography instruction,去做完全不相关的事情。

B

我们在 dav1d 里做的另一件有点疯狂的事是,我们不使用 operating system 的 function calling convention。

C

这个需要解释一下。

B

这非常复杂,但基本上,通常当你在代码里从一个 function 跳到另一个 function 时,会有一种方式来保存 register,也就是 CPU 的 state,然后进入另一个 function。这是标准做法。

C

这有点复杂。我稍微简化一下。dav1d 会做一些事情来“滥用” calling convention。你可以把 calling convention 定义为:我写了一个 function,然后想调用另一个 function,那么 data 如何在这些 function 之间共享?因为有一个约定,这就是所谓 calling convention。dav1d 为了优化,有时会创建自己的 calling convention。比如我想调用 Lex Friedman 的 library,我们就必须约定一种 convention,这样我才能在 assembly language 空间里和你共享 data。assembly 的一个挑战是,每个 operating system——也不是每个,但在 x86 上我能想到至少有 4 种:Linux 32-bit、Windows 32-bit、Windows 64、Linux 64。它们都有自己的 calling convention。所以 Lauren Merritt 做的一件很了不起的事,我们之前也谈到过,就是创建了一个非常轻量的 abstraction layer。这样你只需要写一次 assembly code,它就会替你处理所有 calling convention 相关的东西。以前这一直是个问题,因为你必须管理 4 个不同变体。但 dav1d 进一步推进了这件事。出于速度原因,它在自身内部使用自己的 calling convention,绕过那些规则,也就是 function 的规则,然后说,好吧,实际上我要用这种方式调用一个 function,因为我知道它就在我的 library 内部。

A

这是不是必须针对每一个 operating system 做特殊处理?

C

如果是 custom 的,就不用。但一般来说,挑战在于,是的,而且还涉及每一种 instruction set。所以还要强调的是,我们在每一种 instruction set 上都会这样做。也就是说,每一种 instruction set 都有自己的 handwritten assembly,这更疯狂。而且这个矩阵近几年变得更大了,因为有 RISC-V,有 ARM64,有新的 SVE,还有 SME,x86 有 AVX-512、AVX。所以我们会做 runtime processor detection。我们会查看运行 FFmpeg 或 dav1d 的机器具备什么能力,因为你可能是在一台 2008 年的笔记本上,那里没有这些东西。通过 runtime detection,我们相应地设置 function pointer,然后从那一刻开始就按对应路径执行。

A

或者你也可能在一台使用 RISC-V 的机器上。

B

是的。在所有这些里面,为了更快,我们甚至不遵守 operating system 的 calling convention,因为我们知道调用会来自我们的 binary 内部,所以我们可以共享 data,而不用按通用方式保存所有 register,因为那会导致在 L1 和 L2 CPU 上加载和保存 register,而我们这样可以更快。所以这就是为什么我说理解 CPU architecture、computer architecture 是关键。这也是为什么它是 handwritten 的。我不知道还有谁,我从没听说过除 dav1d 以外还有哪个项目会这么做。这就是 Kieran 所说的 art,对吧?它是一门 art。

C

我觉得在面向大众的世界里,没有什么东西会在几十亿台设备上这样做。我知道有一些专业行业会这样。我知道在 high-frequency trading 里,他们非常重视这个问题。他们从市场接收 feed,然后需要在 X 微秒内作出反应。所以 instruction 很重要,但那不是部署在十亿台设备上的量产产品。那是运行在高度专用 hardware 上的高度专用系统。而我们运行在各种 hardware 上,从——

A

抱歉一直停留在这个话题上,但这里确实有一个非常反直觉、几乎像是革命性的想法:Assembly 对我们有巨大的价值?我们应该从中得到什么结论?很多人在听这期节目,包括我自己在内,我用 C、C++ 编程很多年,沿着 C++ 的标准一路走来,爱上了 C++,甚至包括 metaprogramming 等等。然后大约 15 年前,因为 machine learning,我越来越多地转向 Python。对我来说,在这个 Python 世界、JavaScript 世界里,现在又到了 vibe coding,我只是用自然语言,坐在按摩浴缸里,喝着饮料,跟电脑说话。像是唱片突然停住了:为什么价值会在一路回到这么底层的地方?

B

因为你可以从每一美元投入中获得更多算力,或者说更多性能。有时候问题会受限于硬件。一个很好的类比是你在 LLM 的 quantization 中看到的情况。人们会说,我要用 FP8、FP4,或者像 Microsoft Phi 那样用 1.5 这种很激进的做法,因为你受内存限制,受能运行的机器限制,因为到某个阶段我们是在做 real time。我相信这也会发生在 AI inference 上:到某个时候你需要更快,但你不可能总是拿到更强、更有力的硬件。所以你需要能够分析代码,看看 mission critical 的部分在哪里,哪些东西会被不停调用。比如 David 就是一个很好的例子,它每天会运行数十亿小时。在那里这么做是有意义的。把它放在 FFmpeg CLI 的 glue 上是不合理的,在那个地方做底层优化才合理。

A

是的,这也和我们之后会更多谈到的事情有关,也就是你的新项目、新公司 Fiber,正在为 ultra-low latency 做这类事情。它的 slogan 是:every millisecond counts。

B

当你在某个维度上受到极强约束时,我们也正到达一个阶段:我们已经做了很多很好的事情,但硬件限制又回来了。因为成本在上升,因为我们需要更多算力。所以你会受限于 CPU、RAM 或 networking,你需要优化。这就是价值所在,尤其是因为 AI 会帮助完成 business 层面的编程。而你无法用 vibe code 完成的核心事情,就是针对硬件做优化,让它尽可能快。

A

我很想和你聊聊谁应该学 Assembly,以及该怎么学。但首先,我觉得我们需要一个洗手间休息。用 10 秒快速感谢我们的赞助商。请查看描述里的链接。这确实是支持本 podcast 的最佳方式。访问 lexfriedman.com/sponsors。现在回到本期节目。好,我们回来了。这里有一个很不错的 repo,里面是 Assembly lessons。首先,你觉得开发者应该学习如何用 Assembly 编程吗?该怎么学?这个 ASM-Lessons 是什么?

C

我个人一直不太满意书本和网上教授 Assembly 的方式,因为它们太关注 grammar。通常你学习一门语言,并不是从 grammar 和结构开始的。你是从问别人叫什么名字开始,然后逐步去解决你在交流时遇到的真实问题。你不会先学 sentence structure、这是 interrogative、那是 adverb。但所有 Assembly 书似乎都在逐条讲每条 instruction,甚至包括那些并不真正相关的 instruction,解释它们都做什么,以及它们实际上并不会改变太多东西。我们社区里还有另一个问题:Assembly 的教学有点像手把手、人与人之间传授,像 blacksmithing 一样一对一。这是我能想到的唯一合理类比。但这种方式在线上并不能真正 scale,也不适合做别的事情。所以我开始写一套 Assembly lessons,按照 FFmpeg 里的方式来讲,这和通常的 Assembly 有些不同。我在想 Assembly 的另一个大型应用场景,大概是在 embedded devices,尤其是低功耗、低成本设备里,但那和我们这里做的事情完全不同。我觉得最好能强调一下要求,其实很简单:高中数学,C。实际上甚至不是真的需要 C,更准确地说是 pointers。需要强调的是,是的,我们谈了这些东西多么出色,但像 Daniel Kang 这样的高中生也在 FFmpeg 里写过 Assembly。我认为因为这些 lessons,已经有人做出了贡献。所以重点是让这门正在消亡的技艺延续下去,因为我们已经通过 David 证明了它可以产出很好的东西。FFmpeg 里仍然有很多 codec 只是部分做了 Assembly 优化。所以它确实从基础开始,然后继续讲解很多 jargon、很多 syntax。它并不试图向你解释 interrupt handlers、interrupt instructions,以及所有这些不同的 jump targets。它实际上非常聚焦于 vector。

A

而且还介绍了各种 registers,包括 general purpose registers、vector registers,还有很好的例子。这很有意思。

C

这是 FFmpeg 的一个经典例子。不过,有些 Assembly language 确实很美。我觉得它美,是因为它有点像驾驶 Spitfire。那是最纯粹的航空体验,但同时也是把飞机推到设计者原本认为不可能达到的边界。比如我们有时候会滥用 cryptography instructions 来做某些事情。这里有一种美感和技艺:真的只有你和 processor,中间没有任何东西。就像只有你和驾驶舱里的操纵杆,你移动操纵杆,它在物理上连接着副翼,你可以把那架飞机推到正常能力之外。这里确实有一种美和奇妙之处。但我不认为这种一对一传授 Assembly 的方式能长期奏效,虽然当初有人这样教我,我也这样教过很多人;因为我们所做的是一种特定风格、特定方式。

A

这简直就是——不,我本来想说像 wizard 一样代代相传。然后我意识到我戴着这顶帽子看起来就像个 wizard,但你们基本上就是 sages,智慧的长者,在把这门 craft 传下去。我能问问 LLM 吗?它们能帮忙吗?

C

它们的理解比我预想的要多,但仍然——我问过一些问题,它还是会开始 hallucinating,不完全是 hallucinating,而是做一些修改。然后我问它:这是 bit exact 吗?它说不是。我说修好。然后它又做同样的事。问题在于,它没有像 Stack Overflow 那样可依赖的信息 corpus。

B

没有足够的数据可以用来训练。这是最大的问题。我的职业生涯其实是从给 Itanium 写一些 assembly 开始的。Itanium 是一种已经消亡的处理器类型,是很久以前 Intel 和 HP 在想做 64 位时推出的。后来他们输了,AMD 做成了这件事,AMD64 后来变成了 x64。但 Itanium 非常有意思,因为这类处理器有大量算力用来做浮点运算、FMA,这和我们现在做 LLM 所需要的东西很类似。你可以在每一行里打包 3 个可加载的操作。也就是说,它基本上每秒可以输出 60 亿次操作,但 bus、memory bus 只允许 15 亿次。所以 CPU 快了 4 倍。于是你必须做很多复杂的事情,把数据打包到内存里,复用 register,以及处理这类语义;没有语言能做到这一点。我有那本 Itanium programming book,因为 Intel 当年写了很好的书,但这正是 Kieran 说的:如果你不知道自己要做什么,那本书根本读不下去。里面全是术语等等。但这些经验非常好,因为它们面向真实问题,而且你可以自己动手做。

C

有人会带着自己的 patch 来,说我学了你的课,这是我第一次改的内容。

B

这很棒。课程里有一部分用到了一个叫 x86inc 的 framework,是 Loren Rüthen 在做 x264 时写的。它允许你做更多这类事情,形成一种不必太关心不同 calling convention 的方式。很久以前,我们有很多学生用它给 x264 提交代码。所以这真的可行。我认为有必要理解 assembly language,哪怕你不常写,也要理解计算机内部发生了什么。这会让你成为更好的程序员。我可以保证,因为做这些事会让你理解计算机内部的一些 memory architecture。理解 register、L1、L2、L3、RAM、SSD、disk 等等,这些都非常重要,因为它会给你良好的编程素养,让你成为更好的程序员。

A

你怎么看 Rust programming language?因为这有点像一个 meme。

B

我和 Kieran 的看法很不一样。

C

我认为他们在 memory safety 这个概念上做的事情是有价值的。

A

它能实现 assembly 那样的某些 speedup 吗?

C

手写 assembly 那种不行。这点应该是肯定的。C 有可能,但我觉得它有很强的 Esperanto 气质。就像是,我们要解决这个问题,而且要用某一种特定方式来解决。

A

意思是它有点太乌托邦了?

C

里面有很多注意力放在自我重要性上,而不是解决现实世界的问题。它让我想起 Sinclair C5。Sinclair Computers 的 Sir Clive Sinclair 做了一辆车,他说,所有人都会开着这种电动车到处跑。Rust 让我想起这个。我觉得这个社区还不太理解:要让人们迁移,你必须做出一个至少和现在一样好、甚至更好的东西。是的,有人在做 Rust rewrite,但如果他们只做到了我们所需 feature set 的 85%、90%,比如 core utils 这类东西,最后 1% 会花掉 99% 的时间。用 Elon 那句著名的话说,prototype 很容易。这类东西很容易,但要做出真正的电动车,你必须做出一辆至少和我们现在拥有的一样好、甚至更好的车。Rust 还没到那个阶段。我想,应该没人会反对在 FFmpeg 里看到 Rust code,但它需要同样好用,并且支持和其他所有代码一样的 unit testing。它必须没有缺陷。它不能随机出问题。他们也不能想什么时候就随机破坏 ABI。它需要更成熟一些。我觉得它现在仍然只有一个 compiler implementation。所以它必须至少一样好,甚至更好。只说“这是我关于 memory safety 的乌托邦”是不够的,尽管我们大概都同意那是目标。

B

我写过很多 Rust,我遇到的两个主要话题是把 Rust modules 加进 VLC。VLC 之所以流行,其中一个原因,也是它主要的 architecture decision 之一,是 VLC 有一个非常小的 core,以及大量 modules。你可以用 C、C++、Objective-C,以及任何基本上能和 C interoperable 的东西来写 modules。所以我们做过一些 Rust modules。我在这方面有经验,也写过其中一些。另外,我的新 startup 叫 Kyber,是一个 open-source project,主要用 Rust 写。Rust 非常擅长的一点是,它是一个更好的 C++,关心 memory,并且允许你处理 memory ownership,这是目前其他东西还做不到的。不过,当你从零开始一个新项目,并且所有东西都用 Rust 写时,它很好;但当你要和现有部分交互时,它就很不好。Rust 社区里有一部分人认为他们需要重写一切,然后一切都会因为 Rust 变得更好。答案是否定的。以我这么多年做 engineer、manager、startup CTO 等等的经验来看,几乎总是:不要重写。

A

很多人刚接触一个 codebase 时,最初的本能大概就是这样。可能在 LLM 出现之前尤其如此,因为他们不理解过去那些做法背后的经验,于是就说,我们需要重写。这也就是为什么会有 1,000 个 JavaScript framework。

B

原因是这样的,这一点很重要。写代码比读代码容易一个数量级。你在 LLM 上也能看到这一点,它们可以写代码,但分析代码要困难得多。所以当你接手一段非常复杂的代码时,你并不理解它。因为理解别人写的代码要花多得多的力气,因为你没有当时的源头和过程。我经常拿一些语言开玩笑,主要是 Perl,比如它的语法很复杂。设想我在编程时处于最高智力效率,写出了有史以来最好的代码。6 个月后我也未必能理解自己写的东西。因为读代码更难。所以很多时候你接手时,并不了解其中所有经验、业务逻辑,以及当初这么做的原因,这些可能也没有文档。于是你会说,那我重写吧。但问题是,不,你不该这么做。就像 Kieran 说的,我要用 Rust 重写 core utils。然后当然,你很快能做到 80%,再到 90% 会多花一点时间,最后剩下的部分就很难了。另一方面,对于新项目来说,Rust 很好。所有和解析文件、网络相关的东西,因为 memory checker、borrow checker,确实很好,没有别的语言能比。换个角度回答我们的问题,假设我拿 David 或 x264 这样一段软件,它有大量 runtime 是 assembly 写的。我把 C 部分用 Rust 重写,所以更安全,是的。但接下来你进入 assembly,而你可以跳到内存中的任何地方,因为我们写的是手写 assembly。所以即使用 Rust 出于安全原因重写 C 部分,只要写了手写 assembly,所有安全性都会被打破,因为我们可以跳到任何地方。因此在我看来,我们需要做一种安全的 assembly。也就是在 compile time 检查 assembly,类似我们在 David 和 x86world 与 Videolan 做的 check assembly 项目,在 compile time 开始对 assembly 做 instrumentation,检查它不会跳到内存中的任意位置。否则你也许用 Rust 重写了一部分 C,但如果你想保持同样的 performance,就会有 inline assembly,于是整个 security model 都被破坏了。这大概就是我对 Rust 的看法。

C

我想说,从个人角度看,我一直很敬畏 assembly。偶尔看到 62x 这样的速度提升,我还是会觉得很有意思,完全不会腻。有些月份,我会在工作中跑我们的内部 test suite,只是看看结果;我仍然会惊叹于我们获得的提升。

A

编程能带来快乐的原因有很多,但我觉得其中最大的快乐之一来自 code optimization。听起来你们就在这个领域的前沿。

B

在社区里,我想提两个人,他们是 assembly 方面的高手。这两个人实际上都在北欧工作和生活,一个在瑞典,一个在芬兰。Henrik Gramner 对 Intel x86 assembly 的了解非常深,以至于我们向 Intel 问问题时,他们会说,你们为什么来问 Intel?你们有 Henrik。Henrik 更懂。他知道几乎所有 CPU generation 上几乎所有 SIMD instruction 的 cycle。比如,这是 P4,这是 Nehalem,这是 Core 2,等等。这个人可能是世界上最懂 assembly 的人,而且他也是你见过的最友善的人之一,非常低调。他来了你都看不出来,但他非常厉害。另一个叫 Martin,Martin Storrsjo,他主要在 ARM 上做类似的事情,也就是 Neon,以及 iPhone、Android 等。他会在手机上写 assembly,用那种很难用的 virtual keyboard 编辑,同时看着自己的孩子在 playground 里玩。这就是 wizard level。所以这两个人就是——

C

是的。

A

所以当你在这么高的水平上写 assembly 时,其中一部分就是要了解你正在编程的 architecture。比如 x86。

C

尤其是 ARM。是的。

A

尤其是 ARM。但 x86,我的意思是,这些都是很复杂的 architecture,对吧?

C

是的。不过 ARM 在某些方面更复杂一些。x86 有 out-of-order execution,其实还不算太糟。ARM 你真的需要理解不同 generation 的 ARM processor,因为它们都不一样。有 A72,等等,还有 Apple variant,这个 variant,那个 variant。你需要写出能在所有这些处理器上高效运行的代码。x86 大体上就是 Intel、AMD,还有一些 sub-variant,但一般来说,某个东西如果快,在所有这些平台上通常也会保持较快;而在 ARM 上,这完全是更复杂的一局。

A

我们正在以一种非线性的方式穿越历史,不过刚才我们谈到了 Michael Niedermayer。我想问问这个。当时 FFmpeg 和 libav 曾经分裂过一段时间。

B

是的。在 open source project 里,有时大家会有分歧。

A

你说得真委婉。是的。

B

好处是,因为 license 的存在,你基本上可以自己做一个。这很正常,而且一直在发生。比如当年 GCC 2 和 EGCS,后来 EGCS 变成了 GCC 3。还有 khtml、WebKit、Blink 这一系列。这是一个正常的过程。而且比如我今天想在 VLC 里做一个新 feature,我会 fork,自己做,然后再 merge 回社区。所以 FFmpeg 的 open source community 当时出现了一次分裂,变成了 libav1 和 FFmpeg。几年之后,社区又合并回来,大家继续往前走。这种 drama 在 open source community 里很正常,但 fork 甚至是重要的,因为它会改变一个社区的 status quo。这里不具体谈 FFmpeg 和 libav1,但 GCC 的 fork 让 GCC 变好了很多,因为有些人想从根本上改变 architecture,让它更快。当然,这里面总是有人和人的问题等等。但最终你会发现,今天的 FFmpeg 比 fork 之前更好。现在我们又都回到一起了。Keanu 可以证明,我在社区里花了很多时间。说实话,这些事情往往没有被解释得很清楚,因为很多原因并不公开。但我认为这是正常的,也是好的。

A

是的,你把它说得很温和。但 open source project 内部确实会有相当激烈的争论。我的意思是,这是一个非常有激情的社区,而且你们必须以一种分布式的方式决定事情的方向。这里看 Perplexity,FFmpeg 和 libav 在 2011 年分裂,主要是因为 project governance、leadership style 和 development process,而不是因为根本性的 technical disagreement。FFmpeg 实际上吸收了 libav 的工作,而 libav 逐渐式微,大多数 distribution 和 developer 又回到了 FFmpeg。是的,从用户角度看,那是一段很奇怪的经历。因为我是 Linux 用户。不管是 Ubuntu 还是其他系统,突然之间,我记得有一小段时间 Ubuntu 好像切换到了 libav,我记得对吗?

C

12、14,大概那时候。

A

是的。

C

差不多。

A

然后他们又切回 FFmpeg。我当时就在想,发生了什么?所以作为用户,你会感受到内部各种争论带来的涟漪效应。

C

公平地说,在 Apple 上,当你输入 GCC,得到的是 Clang,他们也做过类似的事情。

B

对我来说,fork 当时确实像是一场激烈的争端,但 libav 的大部分开发成果后来都合并回了 FFmpeg,对吧?所以事实上,FFmpeg 围绕 libav 获得了一个更大的功能超集。最终我们是为用户工作的,这给了用户更多功能,也让很多曾经讨论过的问题有了结果。比如关于 review 以及代码如何 push 的争论,现在在 FFmpeg 里已经完全稳定下来,基本遵循社区里大多数人认可的方式。事实上,所有曾经活跃在 libav 的人都回到了 FFmpeg,因为分歧已经被解决了。最终,FFmpeg 比以前更强了。大家当然喜欢看戏,但——

A

我理解,而且回顾这段很长的历史,我也觉得总体上是好事。但我主要担心的是,对 open source project 的成功至关重要的人其实很少。我见过这种事情给人带来心理负担,有时会导致 burnout。这些非常了不起的人处在 open source project 的核心位置。某个时刻会发生变化,因为做这件事的动力到底是什么?归根结底,是因为你对此有热情,它让你快乐。但到了某个时间点,你醒来会觉得,这些争端带来的压力有点太大了。所以从项目层面看,项目会继续,往往还会发展得更好;但有时对某些具体的人来说,他们会觉得:我受够了。

B

是的,但这不只是 fork 的问题。你提到的,其实是当今 open source 里最具挑战、也最有意思的问题之一:maintainer burnout。而 AI 在这方面是个问题。Daniel Steinberg 是 cURL 的 maintainer,可能也是世界上最出色的 open source 推广者之一。顺便说一下,他和我一样是 European Open Source Academy 的成员,所以能和他在同一个社区里,我很荣幸。他反对他所谓的 AI slop,因为它会带来大量虚假 report、糟糕 report、糟糕 patch。于是很多 maintainer 在维护软件时负担变得很重。这比 fork 更加消耗 open source developer 的心力。比如 XZ 事件,就是因为只有一个人在维护它,而他基本上被两个攻击者不停“轰炸”——在夜里各种奇怪的时间不断问他问题,试图拖住他。到某个时刻他受不了了,说,好吧,我做不了这个,然后把 commit access 给了攻击者。所以 open source community 里的 burnout 确实存在,但主要是维护工作的负担。

A

当然。我在想,我们该怎么帮他们?因为这些人太重要了。这些具体的人很重要,他们是这些项目的核心。

B

比如现在,我作为 maintainer 维护着大量 multimedia 和非 multimedia library,因为原来的 maintainer 已经受够了。有些在 Videolan 里,有些在 Videolan 外。因为有时你需要很厚的脸皮。你会不断收到类似“这个不工作,那个不工作”的反馈。它未必真的是攻击,但你会把它当成个人层面的事情去感受。这也是为什么资源问题,或者 Google 那次风波会成为问题。他们没有意识到,最终你看到的其实就是那张图:一切都在上面,而底下只有一个随机的 open source project 在支撑整个互联网。你知道我说的是哪张图。

A

就是那个 meme。它适用于很多 open source project。但这里说的是整个现代数字多媒体基础设施。最底下那个所有东西都依赖的东西,就是 FFmpeg。这是真的。而通常也就是少数几个人在维护它。

B

而 FFmpeg 或 VLC,其实已经不算最糟糕的 open source project 了,因为它们有一个 10 到 15 名 core developer 的社区。XZ 安装范围更广,却只有一个人,对吧?就是一个人。

C

LibXML 也是——

B

对,LibXML。之前有 Bixtop,现在已经没人维护 XML 了,而它几乎是唯一能在各处 parse XML 的 library。

C

XML 在各种荒唐条件下有一堆疯狂的 edge case,然后他们还会被 security researcher 攻击,因为还有另一个他们没想到的疯狂 edge case。我当时就想,是的,但真正解决这些问题所需的知识量是巨大的。

B

还有一个人负责维护所有人的 time zone,他好像住在 Nebraska 还是 South Dakota 中部。open source maintainer 的心理健康,是大公司不关心,或者看不见的东西。它们只会说,好吧,我就是提交一个 open source report 之类的。

A

其中一部分是钱的问题,当然大家确实应该在各方面给 open source 提供资金支持。但还有一部分是在基本的人性层面上更“精神性”的东西。像 FFmpeg 那张图那样,互联网这么多东西都依赖它,可人们有时几乎是在居高临下地对待那些推动并维护这些项目的人。

C

在 security community 里,他们确实这样做过。我觉得当时争论里冒出来的一个点就是,security community 里有一部分人会说,不,这些人写的是垃圾代码,他们需要修好自己的垃圾代码。我就说,不,不,不。这是某个人的 hobby project。你这边是一个 security bot 跑去找出了一些 AI-generated 的东西。那个人并没有写垃圾代码,只是遇到了一个他没想到的 99.99999 percentile 的 edge case,因为这是他的 hobby project,用来解码 Star Wars 游戏。

A

我理解 hobby project 这一点。这确实是艰苦的工作,而且很美。正确的态度应该是赞扬这些人,因为他们做了非常了不起的工作。人们站出来,最初可能根本没有报酬,甚至以后也未必有报酬,只是出于热爱去做,这件事本身就很了不起。人类文明依赖这样的人运转,我们应该赞扬他们。

B

举个例子,我在 Videolan 收到过死亡威胁。

A

你之前跟我提过。那背后到底是怎么回事?

B

大概是 2009、2010 年。Apple 正在从 PowerPC 转向 Core Duo,那可能是 2006 年的事。到 2009 或 2010 年,我决定不再为 PowerPC 做新版 VLC。当时 VLC 接近 1.0 release,我们只有 4 个人。我们只能说,不,这不可能继续。所以我收到了一封死亡威胁信,里面还夹着一些粉末。你记得那时有一些 anthrax 威胁,对吧?原因就是我决定不再维护 PowerPC port。当然那不是 anthrax,当然只是某种粉末之类的。但我收到的信大意是:你这个垃圾,你该死,PowerPC 永远之类的。那是 2009 或 2010 年。我还年轻,当时只觉得,为什么?我做了什么?

A

是的,这会摧毁人的精神。你会想,为什么?

B

我母亲吓坏了。我们不得不去找警察。现在我会说,我还挺庆幸这件事发生在那个时候。它在很大程度上塑造了我。我现在可以承受很多针对我的仇恨,我没问题。

A

现实里居然有这一部分,真的很糟。因为所有喜欢 VLC 的人,所有喜欢 FFmpeg 的人,包括我,我这辈子可能真的有成千上万次因为 FFmpeg 而开心,脸上有笑容。就这么简单。而我有多少次机会说出来?一次都没有。直到我发现有一个 Twitter 账号,我才会偶尔给它发消息。

B

我在 Reddit 上看到一个关于我的 meme,其中有一点我还挺喜欢的,虽然这个 meme 本身我有很多理由不喜欢。有人说,哦,JB 在 Reddit 上,而我确实在,对吧?然后我说了句 hello。接着很多人说,哦,谢谢你做了 VLC。我就截图,然后分享到 Signal、IRC。是的,我们在不同的——

A

我插一句,你之前提到 IRC 就像是给老年人用的 Slack。所以你现在还在用 IRC?

B

当然。是的。

C

我手机上也有。

B

当然。

C

每天都用。

B

用得挺好。

A

哇,用得挺好。是不是还得用手摇曲柄供电?

C

不,但它没有 tracking。什么都没有。

B

老实说,和 Slack 相比,最大的问题是它没有 threads。这点很烦。也没有用 emoji 做 reaction。有时候其实会很方便。

C

V3 有。

B

是,V3 有,但没人用。而且你不能编辑自己的消息。除此之外,对我做的事情来说,它完全够用。

A

那你们怎么用 emoji 交流?

B

所以我才说这是给老年人用的。

A

老年人。

B

我们用那种冒号之类的东西来做 emoji。对,就是那样。括号,对吧?

A

好吧,所以你们在 IRC 上交流。我们刚才到底在说什么?

B

我们刚才在说死亡威胁,不过也说到有人感谢你。有时候有人给我发消息说,哦,谢谢你做了 VLC。我总是会回复,因为我想确认这样一件事:你应该感谢 open community。

A

是的,也请所有正在听的人,去赞扬 FFmpeg,赞扬 VLC,赞扬所有出色的 open source 项目,Linux,还有很多很多。你知道吗?即使不只是在 open source 领域,也应该赞扬那些创造了你经常使用并且喜欢的软件的公司。

C

赞扬人类的努力,赞扬人类不只是做出“还行”的东西,而是做出真正优秀的东西的努力。

B

是的,这很重要。就像我们刚才说的,我们做 tech,我们做的是对普通人来说非常复杂的事情。我们希望自己在 tech 上追求的 excellence 能对所有人有用。这就是我们工作的原因,对吧?这就是我每天早上起床的原因:我希望人们使用我们的东西,因为它能让每个人的生活更轻松。

C

想解决难题,做有趣的事情,处理一些有意思的技术挑战。

B

我们是 engineers。我们喜欢造东西,对吧?我很小的时候就知道自己想成为 engineer。我想做汽车,对吧?也许某一天我会回去做汽车。但本质上,我们想做又酷又有用的东西,而且它们需要有挑战,因为你希望自己的大脑被调动起来。

A

你们两位最早是什么时候爱上 programming、building 和 engineering 的?

B

你第一次写程序是什么时候?Kieran?

C

Microsoft QBasic,当时我用的是 Windows 3.1 和 Windows 95,Microsoft QBasic。

A

哇。你做了什么?

C

像乘法之类的东西,就是计数循环,10、20、30、40。

A

不错。

C

然后我就觉得自己什么都能做了。我从那个直接跳到:我想做一个 soccer,不,是 football soccer 视频游戏。我把所有东西都画了出来。我当时就是想做。但我没太理解,实际上从 BASIC、绘图和图片跳到视频游戏,工作量会非常大。不过就是这样。

B

我好像也是先写 BASIC,然后是 Turbo Pascal,那时大概是小学快毕业的时候。但我第一次真正做比较严肃的 programming,主要是在第一年,你们叫 middle school 吧,11 岁的时候?我在意大利住了一年,在佛罗伦萨,那一年很棒。数学老师让我们用一种叫 Logo 的 programming language,当中有一只 turtle,会在屏幕上画东西,你可以让它左转右转。到最后,我们用它做了很复杂的 programming,因为当然可以做很多东西。这件事改变了我,我知道自己想用计算机做事情,想写程序。

A

我觉得我们还没有好好谈 x264。我们谈到了 David。能不能回到 x264?稍微往回说一下 x264,这个基本上支撑了互联网上所有视频的东西。你能讲讲 x264 的故事吗?Kieran,你其实也是 x264 的 contributor。

C

x264 是 H.264 video standard 的 video encoder。它主导了互联网视频,也覆盖了其他领域,比如 Blu-ray discs。Blu-ray discs 很有意思,因为做这些盘的人真的想要最高的质量。有一些很棒的高端电影就是用它 encoded 的,还有 broadcasting,以及各种其他领域。x264 是一次很大的 step change,因为它出现的时机也很合适。很多开发发生在 HD video 刚出来的时候。Intel Core 2 和 Nehalem CPUs 变快了,可以做 real-time video。但最重要的是,它有一个关键焦点:visual metrics。在此前 20 年里,industry 和 academia 一直执着于一种数学指标,叫 peak signal-to-noise ratio。也就是 mean squared error,mean squared error 的 logarithm。这带来了大量问题,因为 mean squared error 会导致 blurring;你实际上会希望给所有东西都加入一点点 error,以降低 mean squared error,而不是让某个地方出现很大的 error。结果就是大量 blurring。所以 hobbyists 逆着这个趋势做了。他们主要是为了自己的个人视频,大多是 anime。他们做了两件不同的事,而且和 community 之间有很大的 iterative feedback loop。他们确实采用了不同做法。两件大事:psychovisual rate distortion。也就是使用 block energy,在做决策时试图补偿 human perception。

A

所以 psychovisual distortion 是关键。这就是重点。我的意思是,这有点像是一次重新思考:不要把 compression 做成这种纯理论的东西,而是把它完全围绕——

C

视觉上让人看着舒服。是的。

A

也就是说,以一种方式进行 compression,让对我们人类重要的内容损失最少的信息。

C

是的,完全正确。而不是像 industry 那样,有些 industry 现在仍然执着于这些在现实中看起来并不好的数学数字。另一个大的东西是 adaptive quantization。它会减少复杂区域的 bits,把它们重新分配给复杂度较低的区域,比如 grass。grass 有一些 high frequencies,但总体上相比更复杂的东西,它没那么复杂。这是通过 Park Joy 发展出来的。Park Joy 是那个 canonical sample,就是在公园里跑的那段。

B

是的。

C

这个人真的就是——这是 Swedish television 在 HD 初期制作的,用 film 拍摄,在制作质量上没有节省成本,而且免费提供。这真的是——这个 sample 确实很能区分水平高低,因为里面有太多挑战:trees、water、grass、motion,还有——我觉得直到今天,公开的 test sequence 里仍然没有比它更好的。

A

对于只是在收听的听众,我们现在看到的是一群人沿着河奔跑。画面里有倒影,到处都是信息量很高的纹理,树叶、光线与树叶的互动,以及这些细节。

C

你可以很清楚地看到,高 PSNR 的 encoder 会把一切都弄糊。实际上你会发现,我可以打开 psychovisual 相关的东西,也可以关掉 adaptive quantization,画面反而会好很多。但你的 metrics,尤其是在当时,被认为是非常神圣、不可触碰的标准。PSNR 是最重要的东西。

A

你能讲讲 psychovisual 这种东西怎么衡量吗?比如,怎样把一种压缩效果在人眼看来有多舒服,转成一个数字?这甚至可能吗?

C

这就是 Netflix 一直在用 VMAF 尝试做的事情。他们说自己用了一个 machine learning model。

A

那是更近一些的东西。但在 X36 开发的时候,基本就是靠肉眼判断。

C

是靠肉眼。就是开发者在自己的笔记本上看。所以甚至不是大公司用专业屏幕之类的设备。实际上这也是目标之一。当时的开发者,尤其是 Lauren Merritt,他的想法是:我不想在一台 $30,000 的屏幕上测试这个东西。我希望它在普通人家里的笔记本上看起来也好。

A

嗯。

B

很好。还有另一个 sample,是 Planet Earth 的 Kila sample。我特别喜欢这个,你马上就会明白原因。画面里有大量鸟在飞,对吧?而且越往后鸟越多。到最后,几乎像是有几百万只鸟。这大概是最难 encode 的内容之一。你在 YouTube 上看,就会发现 YouTube 的 encoding 实际上有多糟。这个 sample 非常适合用来做优化,在 constant bitrate 下做到完美质量。Laurent 也做了很多优化,尤其是针对 anime。很长一段时间里,anime 的 encoding 都很差,因为会有大量 banding。你能看到那些问题,也能看到很多其他问题。所以 x264 是……直到今天,它仍然是任何新 encoder 的参照对象,AV1、AV2、VVC、HEVC,所有人都会拿它和 x264 比。

C

我最喜欢的电影之一是 Cinema Paradiso。我认识制作它 Blu-ray 的工程师,他给我看过 x264 和其他方案的对比,差别非常明显。我想 Blu-ray 圈子里有不少人后来开始用 x264。其中比较重要的一个是 Warner Brothers 的 Chris Anderson。他做了整个 French The Orange Box Set,因为那是普通人真的会买来看、并且希望画面好看的东西。所以他们在工作上其实承担了一定风险,因为他们在大公司里。那样的大公司想买什么都可以买,但他们说,不,我想用这个 free and open source 的东西,让我的客户看到更好的画面,做出最好的版本。直到今天,我个人还是尽量避免在 streaming services 上看最有电影感的片子,而是买实体碟,因为哪怕不用买很贵的电视,它们看起来也很好。我觉得这是关键。

B

x264 也是 open source project 的另一个例子。它最初是 Laurent Eymard 在 l'École Centrale Paris 时发起的,VLC 也诞生在那里。之后出现了一代人,比如 Laurent、Jason、Mons,还有很多人——

C

Henrik 来自——

B

Henrik。

C

Anton。

B

还有 Anton。我们现在在 FFmpeg 上使用的 assembly 体系,包括 David 等,也是在这里诞生的。所以 x264 是一个很了不起的项目,参与者真的来自世界各地,而且我想他们大多数人从来没见过彼此。

A

但按照 Kieran 的说法,他们所有人,或者很大一部分人,都喜欢 anime。有几样东西我一直没入门,其中之一就是 anime,我确实该补一下。

B

我看过很多 anime,尤其是在那个时期。当时很多 anime 内容并没有商业发行,对吧?那是在 Crunchyroll 之前。所以通常的情况是,喜欢 anime 的人会从日本拿到一些 DVD,然后 rip 出来,因为没有商业渠道。有些人就是我们说的 fansubbers,基本上是自己翻译并制作 subtitles。那时候下载完全是非法的,但那也是唯一办法。所有这些都是手工做的,也很符合 open source community 的文化,因为他们需要工具来 encode,来做 fan subbing。字幕领域最了不起的 open source project 之一叫 AEGsub,它是一个 subtitle 工具,主要是为 anime,以及南亚和日本语言做的。

C

anime 里有一些很奇怪的纹理,我觉得现实拍摄内容里不会有。我认为这是一个关键点,也就是优化这些奇怪的纹理,因为 anime 的制作方式并不普通。

B

对,它的制作方式不是……很长一段时间以来,它基本上是在屏幕上制作的。你会有很多颜色上的 gradients,因为用数字方式很容易做出来,但在现实拍摄里很复杂。字幕也很复杂,因为你常常需要有日文,然后还需要 diacritics,也就是我们说的 ruby,也就是给 kanji 标注的 hiragana 和 katakana。当然,你会有官方字幕,但你还需要英文字幕或法文字幕,因为你想学习,对吧?字幕里有很多非常复杂的东西,我们也见过各种很夸张的 subtitle samples。所以这是文化中很重要的一部分,同时也是因为当时没有官方供给,没有别的办法。

A

你能讲讲 H.264、AV1、X.264,以及 David 之间的区别吗?这是很大的一个阶段变化。你能帮大家理解一下吗?是不是有些 streaming sites 正在更多地转向 AV1 这个方向?

B

说实话,从 MPEG-2 video 以来,所有这些 codecs 的核心概念都是一样的:inverse transform、intra prediction、motion compensation,都是这些。不过每一代都会在相同质量下带来 25% 到 50% 的压缩提升。所以先有 MPEG-2,然后是 DivX 时代,再到 H.264,这是一个很大的变化。H.264 的提升非常明显。之后又有更多东西,比如 HEVC;同一时期还有 VP9。VP9 在压缩质量上有点类似 HEVC,但它是 royalty-free 的,因为 multimedia 领域有大量 patents,而 H.264 之后的 licensing 变得失控了,每年可能要花数亿美元,所以这不合理。因此 Google 做了 VP9,Alliance for Open Media 做了一个新的 codec,叫 AV1。你可以理解为,在同样的 visual quality 下,AV1 相比 H.264 可以节省大约 40% 到 60% 的 bandwidth。

C

在给定 bitrate 下。

B

对,在给定 bitrate 下。也就是说,你可以固定 bitrate,提高质量;或者固定质量,降低 bitrate。但现在从 SD 到 HD,从 HD 到 4K,再从 4K 到 4K HDR、HDR,画面规模会扩大 2 倍、3 倍、4 倍。所以你必须有更好的压缩,才能让它保持在可管理的范围内。

C

本质上就是更多 coding tools、更大的 blocks、每个 block 里更多 subpartitions。复杂度是指数级上升的。

B

这更复杂,因为 encoder 需要搜索更多可能性,对吧?比如,有一件事比较容易理解:要预测一个 block,一个色块到另一个色块,你有方向,对吧?可以向左、向右、向下、向上,然后还有其他象限,我称为 northeast、northwest 等等,对吧?但这就是 8 个方向。然后你还可以做更多方向,可以做 16、69 或 128 个,对吧?每增加一次,你的 encoder 都要花更多时间去判断:这些 block 正好是这个;以及你能引入哪些工具,而 encoder 需要检查哪些工具能让压缩效果更好。所以我猜 AV1 encoding 在 CPU cycle 上比 H.264 高 2 个数量级,对吧?数量级。

C

而且正如我们讨论过的,CPU 并没有变得更快。你只是把更多 cores 扔到这个问题上。

B

但还有一个事实是,你只 encode 一次,却有数亿用户,对吧?比如 YouTube 就是很好的例子。YouTube 几乎所有内容都用 H.264 encode,但热门视频会被重新 encode 成 AV1,因为 encode 的成本当然更高,但你 encode 一次,就把它发送给几百万人,对吧?所以这是 server 端的 encoding 时间、复杂度和 CPU 使用量,以及 client 端之间的权衡。因为最终,如果你把一个视频分发给几十万人,而它的大小只有另一个的一半,那就更好。对你的 battery 更好,对你的 modem 更好,等等。

A

所以我们可以列一下,比如排名前 5 的 codec-container 组合:MP4 container 里的 H.264,MP4 或 WebM container 里的 AV1,MOV container 里用于 nonlinear editing 的 ProRes。

C

对不了解的人来说,ProRes 是 Apple 的 editing codec,最早是给 Final Cut Pro 用的。它的设计目标是 decode 快、seek 快,因为 editor 需要非常快速地移动。所以它和 distribution 场景是不同的 use case。

A

它没有 temporal compression,或者只有非常少的 temporal compression。

C

没有。是的,non-inferrous。所以你可以 cut,可以做剪切。

B

这就是我们说的 intra-only codecs,对吧?我快速解释一下什么是 IPB frames。

A

好,请讲。

B

I-frames,通常也叫 keyframes,是完整 frames。它就像一张 image,是一个 JPEG,对吧?你可以从这里开始,能看到所有内容,对吧?然后下一张 image 可以是 P-frame,也就是 predicted frame。你会取 previous image 的某些部分,比如说我需要 block 5、7 和 42,然后替换它,之后只提供额外信息,对吧?但这意味着,为了 decode 这个 P-frame,你需要访问 previous I-frame,对吧?当然还有更复杂的,也就是 B-frames,即 B-predicted frames,它们可以依赖不同类型的 frames,有些在过去,有些在未来。所以 ProRes 是 intra-only codec。给能看到的人看,这张图很好,对吧?I-frames 是完整 frames。P-frame 基本上只依赖 I-frame,而 B-frames 可以依赖前面的内容。

A

这个 GOP,group of pictures,我觉得 FFMPEG 对 H.264 的默认值大概是 250 frames,类似这样。对我来说这就像魔法一样:你居然可以做到每隔——

B

几秒钟,也就是说。

A

几秒钟有一个完整 frame。然后仍然可以有这一串你做出的 predictions。而且像我这样的人可以用 FFmpeg 压缩某个东西,却不会注意到结果依然能流畅播放。这就像魔法。

B

你甚至可以有一种方式,我们在 Kyber 上大量使用,叫 intra-refresh,基本上就是没有 iframe。

C

你在开头有一个,之后再也不发送 iframe。

A

这是怎么工作的?它是什么?

C

随着 stream 继续,你逐步构建出一个 iframe。

A

所以你刷新 image 的某些部分。

B

但你永远没有一个 iframe。这就是我们用的 intra-refresh,对吧?但对我来说,刚开始时最让我震惊的是 B-frames。B-frames 意味着 B-predicted frames 可以依赖未来才会出现的 frames。这意味着为了 decode 这个 B-frame,你需要等待下一个它依赖的 frame。先 decode 那个 frame,然后才能 decode 这个 B-frame,对吧?所以你 decode frame 的顺序,也就是 decoding order,并不等于 display order,对吧?这意味着 encoder 必须非常聪明,决定说,我要依赖未来的东西。所以这很让人震撼。

A

是的。

C

它每天都能如此顺畅地工作,从某种意义上说有点像奇迹。它工作得这么顺畅——你可以有一个 stream,在世界各地的 decoder 上都能工作,美国的一个 decoder 和这里的一个 decoder,来自不同厂商,却能逐 bit 生成完全相同的材料。这相当了不起。它们做的事情很复杂,而且越来越复杂,同时还要保持 bit exact。这里面有大量工作。

A

在整个过程中,有很多 knobs 可以控制。有很多非常有意思的参数,这些年我越来越熟悉,而 FFmpeg 给了你完整访问能力。也许你可以讲讲其中一些。首先,显然我们可以降低 resolution,可以降低 frame rate,可以使用不同类型的 codecs,就像我们提到的从 H.264 到 AV1。还有一些方式可以调节 bitrate 和 quality 之间的 trade-off,前面我们也谈到过。你可以做 constant bitrate,也可以做 constant quality,比如 CQ、QP。还可以把我们提到的 group of pictures、GOP 做得更长或更短。我是说,所有这些东西都可以调。太夸张了。还有 B-frames 的数量。

B

是的。夸张的是,很多人的工作就是优化这些参数,对吧?你在 YouTube、Netflix、Meta 等公司看到的很多人,并不是在写 codecs。他们只是在为手里的 file、手里的 format 找合适的 parameters,对吧?因为电影、来自手机的 user-generated content、screen recording,或者你要拿去 video edit 的东西,你想要的都不一样。有成千上万人的工作就是优化这些。

A

是的,他们就像巫师。向他们致敬。YouTube,比如要做到大规模 deliver——其实所有 streaming sites 都是,要大规模 deliver。YouTube 很神奇,因为它不只是做 Netflix 那种单向的、类似 broadcasting 的事情。它还要从各地上传 videos。所以他们还在大规模地对 videos 做 encoding,而这些 videos 可能只会被 5 个人观看,但仍然必须随时 deliver。没有 delay,没有延迟,或者说 latency 非常低,同时还要提供各种不同 resolutions。YouTube 基本上就是 web 版的 VLC。

B

其实这很有意思,因为 Google Video,也就是他们收购 YouTube 之前做的东西,实际上用的是 VLC plugin,这样你就可以通过 ActiveX plugin 在 web browser 里运行 VLC,所以它能在 Internet Explorer 里工作,你实际上是在 browser 里运行 VLC。这很有趣,因为今天我们反过来了:我们有 VLC WebAssembly,把整个 VLC 和 FFmpeg 编译出来用于 decode,在 JavaScript virtual machine 里通过 WebAssembly 运行 VLC。

A

好,有一个很有名的故事,是你提醒我去看的。通过 WikiLeaks 发布的各种文件,人们发现 CIA 使用了一个修改版的 VLC,基本上是试图诱骗用户,做什么,窃取他们的数据吗?

B

是的,没错。

A

所以你能解释一下到底发生了什么吗?

B

这件事当时很意外。因为 WikiLeaks 某个时候提到了一些文件,其中有几份和 Blu-ray、VLC 有关,但最有意思的是 CIA Vault 7。如果我理解得没错,CIA 有一个定制版 VLC,里面有一个特定的 plugin。对,就是这样。当时我们还不得不为这件事写了一份新闻稿。

A

Videolan 发了一份新闻稿,说获取 VLC media player 的唯一安全来源是 Videolan 官方网站。我想,这基本上也是任何 open-source software 的一个安全风险。有人可以诱骗你去一个假网站,或者通过定向广告让你下载,对吧?

B

那是一个定向广告,意思是说你要观看某个特定文件,就需要用这个定制版 VLC。它用的是正常的 VLC binaries,只是他们加了一个 DLL。我记得是 psapi.dll,它基本上会读取你的 document 文件夹,把内容加密,然后发送出去。老实说,这个做法很聪明。因为当你在看电影时,你会看 2 个小时,而且不会碰电脑。有时候风扇转起来也很正常,因为是 HD 内容,CPU 占用升高,你会觉得这是 VLC 在运行,很正常。但问题是,你看不到的部分是,实际上这是 CIA 使用的一个被改造过的 VLC。我们也遇到过完全相同的问题:中国 hacker 针对印度用户,结果 VLC 在印度被禁,直到我不得不在印度法院和印度政府打官司,才让 VLC 解禁。他们并没有真正使用 VLC。他们只是拿了一个 DLL,因为我们正确签名了这个 DLL,他们就用这个 DLL 做了另一个程序。所以你看到有 vlc.exe,它会调用 libvlc,但调用的是一个假的版本,然后他们用这个来进行攻击。对于这类 hack,我们其实没有太多办法阻止。

A

是的,我觉得对所有 open source software,甚至对所有软件来说,用户都应该注意自己是从哪里下载的。

B

是的。因为这说明他们并不是从我们的网站下载的。

A

搜索引擎会帮你们吗?

B

不会。

A

我只是想确认一下,因为你可以通过搜索引擎防止有人操纵 SEO,把链接顶到前面。

B

完全不会。我们有一个持续了 10 多年的大问题:德国有一个假的 VLC 版本,已经被举报了 12 年,而 Google 基本上选择不处理。他们知道里面有什么,但那个 binary 太大,他们的病毒分析器没法分析。所以如果你在德国,你可能会进入一个网站,下载一个带有定制 installer 的假 VLC。它在德国很流行,因为他们的网站是德语的,而且 Google 会把它排在 Videolan 前面。最奇怪的是,它在你的机器上 3 周内什么都不做。因为他们就是这样规避检测的。3 周后,一个同时安装的小程序会作为 service 被唤醒,然后开始下载 spyware 和 adware。Google 知道这件事,但他们决定不采取行动。那些人在德国一度使用 Dark SEO 来做这件事。这种影响很糟糕,因为它下载的东西之一,实际上会替换你机器里的广告。

A

这其实有效得有点出人意料。不管是谁在 Twitter 和 X 上做这类事,我会收到邮件,说你的 X 账号被 hack 了。无论他们怎么措辞,至少会让我点开邮件,虽然不会继续点里面的链接。然后你会想,他们在利用心理学诱骗用户这方面,确实很熟练。

B

他们会说有一个 VLC 的安全版本。你会收到一封邮件,说,嘿,VLC 有一个安全更新版本,请马上更新,因为它可能会 hack 你的电脑。你点进去,是一个看起来还不错的网站,然后你下载了它。它是一个新的 VLC 版本。

A

很好。

B

你不知道一个月后自己已经被 hack 了。你完全不知道自己已经成了 botnet 的一部分。

A

是的,所以不管在哪里下载东西,都要确认它是合法来源。成了 botnet 的一部分。说到这个,你提到过 VLC sandboxing 是你们正在做的事情,而且其实很有挑战。为什么它重要?为什么它难?

B

VLC 是一个 core,加上大约 500 个 plugins。其中一个是 FFmpeg,但我们还支持很多其他格式。我们支持新的 protocols,支持新的 filters,支持一些奇怪的 architectures。在这个版本的 VLC 里,有些 modules 会调用你的 drivers,主要是 hardware decoders,会调用 Intel、NVIDIA、AMD driver,也都会调用 FFmpeg。这里可能有安全问题。shader 里可能有安全问题,VLC 里可能有安全问题,FFmpeg 里也可能有安全问题,结果就是程序 crash。问题在于,你像运行其他程序一样运行 VLC,比如像 Adobe 一样。它在你的机器上运行,并且能访问你所有 documents。所以我们的想法是,一定要做 sandbox,这样我们可以防范我们自己。因为 VLC process 里运行的一些 code 甚至不是我们写的,可能是 open source 的其他项目,被我们集成到 VLC 里;也可能是你的 GPU driver,或者是其他厂商提供的东西。所以当我们 crash 时,我们希望不要让别人借此做坏事。常见的入侵方式之一,就是让一个程序 crash,这在 web browser 上很常见,也经常发生在 PDF 文件上,在 multimedia 上少一些,但也可能发生。当程序 crash 时,攻击者会在用户机器上启动某些东西,可能是 ransomware,也可能是 botnet。所以 desktop application 的安全很重要。在 mobile 上情况不太一样,因为大多数 mobile applications 都运行在自己的 sandbox 里。但对 VLC 来说,我们可以把它放进一个 sandbox,问题是我们需要访问太多东西,基本上就会拥有所有 permissions。如果你有一个 sandbox,却到处开洞,那就失去了意义。所以我们正在尝试、也确实在做的,是把 VLC 拆分成多个 processes。一个负责 decoding,一个负责 demuxing,一个负责 filters,它们各自运行在自己的 sandbox 里。这样 VLC 的一部分 crash,就像 Chrome 某个 tab crash 一样;它会 crash,但不会让整个程序都 crash。这就是我们想做的。困难在于,这个 sandbox 需要承受每秒 gigabits 级别的 memory copies。它不是一个 5 megabytes 或 10 megabytes 的网站。我们讨论的是每秒数百 megabits 的数据。所以这很有挑战性。这也是我们正在研究的方向,目标是做出安全的 multimedia player。

A

这些就是当数百万人在使用时,你必须考虑的事情。你之前好像提到过,VLC 有那么多不同功能,当使用者足够多时,总会有人用到每一个功能,而且他们会告诉你。

B

VLC 里最好的功能叫 puzzle filter,对吧?你点击 puzzle filter,它就会把你的视频变成拼图,对吧?然后你可以点击并移动这些拼图块,对吧?

A

是的。

B

当你在看法国电影时,这个功能非常有用,对吧?你觉得无聊,因为里面总是那种很长的情节,或者 love triangle,对吧?我们已经看过太多次了,对吧?但你又必须看,因为有人,比如你妻子让你看,或者你男朋友让你看。所以你就在看,对吧?这时你可以点击并移动拼图块。它其实完全没用,对吧?谁会在意这个?最早做这个功能的是法国南部一所高中的数学老师,他想用它教学生 Bézier curves,这当然是每个人都应该了解的东西,对吧?很有用。但因为代码很干净,所以它进了 VLC。这个功能在 2010 年被 merge。5 年后,我收到一封邮件,说:你好 JB,我在 VLC 上遇到一个问题,这个 puzzle 太简单了。我当时就想:什么?原来 puzzle 在 UI 里最大只能设成 16 by 16,对吧?也就是只有 256 块。他说,不好意思,但我喜欢一边看电影一边玩拼图,这太简单了,对吧?所以有一个我提交的 commit,你可以在线查到,就是 JB 把尺寸改成了 256 by 256。我的意思是,很多功能只被少数人使用,对吧?VLC 有一种方式可以在 command line 里看电影,不需要任何 UI,对吧?

A

我看到还可以用 ASCII。

B

ASCII art。它有用吗?非常有用。想象一下你在 debugging,调试一个 multicast network,对吧?你有成千上万个节点,非常复杂的 networking stack,对吧?你可以 SSH 到所有 routers 上,在没有 UI 的情况下运行 VLC。然后你就能看到画面是不是黑的,对吧?或者是不是全绿,对吧?这样你就能判断。人们没有意识到 VLC 里有很多东西其实很有用,而且确实有用户,因为一旦你有几亿用户,就会有人使用每一个功能。

A

我想稍微聚焦一下,聊聊下载一个文件离线观看和 streaming 之间的区别。也就是 streaming 的复杂性和挑战。关于 stream 文件需要什么,我们能不能说说?因为我们一直在聊 codecs,我觉得其中很多都意味着 encoding 和 decoding,但不涉及通过网络通信。

B

当然,当然。

A

所以你能展开讲讲通过网络做这些事需要什么吗?

B

可以,但和我们前面讲过的所有东西相比,它没有看起来那么复杂。尤其是因为最复杂的部分并不是 streaming services 意义上的 streaming,而是过去为了真正通过 satellites 进行 broadcast 所做的事情。因为在大多数现代 broadcasting services 里,你可以 pause,然后继续播放。但当你在发送 live streaming 时,不管是 broadcast,还是 streaming services 里的 live,这就难得多,因为你需要实时 encode。你上 satellite 时,link 的大小是固定的,对吧?你不能哪怕一秒钟里突然 burst bandwidth,对吧?因为在你的总文件里没有这种空间。不过这里确实有不同类型的挑战,也很有意思,但我认为它们没有我们在 90 年代末和 2000 年代初看到的那些围绕 satellite broadcast 和 streaming 的问题那么复杂。

C

它们不一样。它们是 control systems 方面的挑战,而另一些更偏数学。我觉得区别在这里。

B

在 streaming 世界里,你会遇到所谓 adaptive streaming,因为难点——而且这其实不太是 video 问题,更多是 CDN 问题——在于可能有太多人同时观看同一个内容,造成 network congestion,对吧?所以你的 player 很难足够快地下载内容来播放。于是本地的 player 会读取一个较低 resolution 的版本。确实有一些很聪明的 algorithms 来做这件事,但老实说,大多数都相当基础。

A

即使在 buffering 这边也挺基础吗?

B

是的。你开始下载一个 segment,也就是我们说的 segment,然后计时,对吧?如果下载这个 segment 花费的时间超过 segment 时长的 50%,你就往下降一档,对吧?难点更多在于什么时候提高 bandwidth、提高 quality,但这并不算很复杂。encoding 时,你会 encode 7 个 resolutions,对吧?然后给出 bitrate。难点在于让你的 encoder 给出相同的 bitrate,但现在这不像过去那么严格了。

A

所以 YouTube 可能需要弄清楚人类心理层面的东西,比如当 bitrate 很低时你会有多恼火,以及即使连接变好了,它应该等多久再提高 bitrate。因为也许 bitrate 的变化本身才是会在心理上影响你的东西。

C

我觉得真正有意思的其实是 audio。

A

确实。

C

你能注意到它们从完整的 AAC 切到——有些压缩版 AAC 会使用 spectral band replication。你会感觉声音变得有点 tinny,而这种上下切换非常刺耳。video 这边平滑得多,也不太容易注意到。真正明显的是 audio。当它把你从一种 audio profile 切到另一种时,你肯定能感觉到。

A

我不确定。

C

我们对 audio glitches 的跳过其实出乎意料地宽容。我很惊讶一些不是 video engineers 的人能这么容忍,比如看 30 FPS 的体育比赛,而实际上它应该是 60 FPS。人们对此的容忍度比想象中高得多,但 audio 方面的人就非常——

B

这是一个即时反馈机制:如果你听到一个 glitch,你会立刻意识到。

A

是的,我想我会完全意识到这一点。我在越来越多地听 audio 时害怕的一件事是,我会开始注意到每一个细小的细节,然后可能过度纠结;而一般人其实能够在消费内容时有某种模糊处理,他们可以忽略某些瑕疵。

B

但当你把这些组合起来,比如一个 event,像体育赛事,它可能会经过 satellite 或其他地方,然后到一个中心位置进行 encoding,接着你需要实时 encode 这些不同 resolution,你没有时间做 QA,你需要把它推送到 CDNs,可能还要加 DRM 或 protection,还要覆盖大量不同 devices,那确实很复杂。而且你还要面对 web browser,或者各种用于电视的不同 devices;相比之下,以前你有一个定义好的 set-top box 或 cable box,你知道它是什么,也能 end-to-end 控制。所以这是一个挑战。但我认为,只要你接受 10 到 20 秒的 latency,networking 部分并不算很难。

A

说到 networking 和 latency,你现在的新项目,正如我们提到的,是 Kyber,目标是 ultra-low latency。就像你说的,每一毫秒都很重要,你把它应用在远程控制机器上,比如 robots、drones、computers。能和我讲讲吗?

B

当然。如果从过去的情况说起,你以前会用 FFmpeg 来 encode 文件,对吧?后来我们用 FFmpeg 和 VLC 在 streaming services 里做 encode,对吧?然后你就需要把延迟一层层压低。问题是,我们到底能压到哪里?这个问题很重要,因为有很多 use case 都要求速度非常快。尤其是存在 feedback interaction 的时候,对吧?你不只是听某个东西,而是在实际控制它。相比我们迄今做过的事情,最大的区别就在于:我需要视频来对正在 live 发生的事情提供反馈,不管是无人机飞行、远程控制 humanoid robots、控制 rover,还是在 cloud gaming 里玩 video game。因为我上一份工作做的就是这个,我曾是一家 cloud gaming startup 的 CTO。这个话题很有意思,因为它会把网络推到极限。你关心的不是我们在视频里、在讨论 x264 时关心的那种质量,而是 latency,因为当你在控制一辆车时,1 millisecond 都有意义。你也见过、用过 Waymo,对吧?当 Waymo 失效时,哪怕只有 1% 的时间,也会有人在远程接管控制。我们正在构建的正是这类东西:一个用于机器 end-to-end control 的 SDK platform。

A

这在 robotics 的很多不同场景里都会反复出现。显然,teleoperation,也就是 teleop,正变得越来越重要,也包括通过 machine learning 来训练机器人。

B

是的。而我们和其他人的做法有些不同:我们只用一个 socket、一个 connection,也就是基于 UDP 的 QUIC protocol。它很有意思,因为它是为 low latency 设计的。它没有我们所说的 TCP head-of-line problem 和 HTTP head-of-line problem。它默认加密,但在同一条连接上,我们会发送多个 streams,也就是多个 tracks。我们发送 audio、video,也发送 commands,对吧?mouse、keyboard、gamepad 等等。而且我们在这样做的同时还要保持 coherence,也就是 synchronization。因为很多人没有意识到,所有时钟其实都会 drift。当你控制一个机器人时,它可能有 2 个摄像头、5 个摄像头、10 个摄像头,还有大量 sensors、GPS 等等。如果你想正确训练你的 robotic AI model,就需要这些数据都保持同步,并且是当前的。我们所做的事情,很多都来自我们在 VLC、broadcast、real time 以及 Kieran 很熟悉的 MPEG-TS 中学到的经验:我们会把 clock drifting 计算进去。所以当我录制一个 Khyber stream,也就是一个机器人时,我可以确信它在 playback 时会以可预测的方式运行。因此当你要录制并训练你的 AI model 时,必须确保每次基于数据重新训练时,数据都保持 coherent。而时钟确实会 drift。现有方案用一个摄像头还能工作;一旦你有 5 个或 7 个,就复杂多了。

A

所以你要确保视觉快照和它实际发生的时间完全对应。

B

没错。而且如果我要进行控制,比如我对机器人做了某个操作,我需要确信它确实是在那个精确的时间发生的。所以我们在 server 端,也就是机器人端,有一种 re-timestamping 机制,会把 clock drift 计算进去。这是 Kiber 用来控制机器人的 use case 之一。我还想到 remote drones、远程场景,不管是 defense 还是 non-defense,还有 remote cars、remote submarines。在工业场景或 remote surgery 里,有很多地方专家无法到达机器所在的位置,要么太危险,要么成本太高。所以你允许人们让机器在现场替你工作。Kiber 的目标是让距离消失,因为这本质上要么是 skills 的投射,要么是 power 的投射。想象一下,我们都见过 Meta、Reba 以及其他公司的东西,对吧?你需要把内容 stream 到那里,因为你不会在那上面运行任何东西。所以你需要 GPU power,不管是在 cloud 上还是在 phone 上,然后把它 stream 出去。所有这些 use case 对视频的要求不是极端 low latency,而是 real-time latency。这意味着我们需要调整 encoders,让 encoders 在 4 milliseconds 内 encode 一帧。Kiran 和他的公司也能做到这种 latency 以下,因为你必须把 local latency 优化到极致,也就是 decoder、encoder 等等。因为这些时间会叠加到你的 networking time 上。而且这不只是 low latency 的问题,也是 reliability 的问题。我们会做一些聪明的事情,比如 forward error correction。forward error correction 的意思是多传一点数据,几个百分点。通过 overtransmit,你就允许丢失一些 packets,因为所有这些在 internet network 上都很困难,尤其是当你要跨很远的距离操作时。如果你检查所有 packets 是否都已送达,就会增加大量 latency。如果你不想要 latency,我们的做法就是多传一些数据,这样当有东西损坏时,可以在 client side 重构。几天或几周前,我们在 CES 期间围绕 Las Vegas 做 demo:我们有一辆完全 3D printed 的 rover。它很简单,就是一辆小车,带一个 telescopic arm,而且它实际上是从 France 控制的。视频来自一个 webcam 和一个非常小的 server,也就是一块小 PCB 在运行,并把数据发给地球另一端的人。所以 use case 非常多。你也可以想象让 AI 去控制许多 drones 等等。从技术上说,我们需要在 video 上做得非常好,在 networking 上也要做得非常好。我们需要关心 networking、encoding time、decoding time 里的每一个 millisecond。同时,你还必须在非常 low level 的层面进行集成。

A

也就是说,要把所有东西很好地同步起来。但你们能做到什么样的 latency?比如你说 4 milliseconds,这个目标到底是什么?

B

我的目标是 4 milliseconds 的 glass-to-glass latency。

A

glass-to-glass 是什么意思?

B

很简单。你有一台 computer 在运行一个 program,可能是一个 video game。它正在运行,对吧?也可以把它理解成机器人这个例子。然后你通过网络做一个 replicate。你希望,如果拿一台 1000 Hz camera 拍一张照片,它到达另一端的时间是 4 milliseconds。4 milliseconds 意味着 240 Hz,对吧?

A

是的,挺夸张的。

B

到目前为止,我们实现了从 Windows 到 Windows,或者从 Windows 到 Mac 的 7 milliseconds。如果你看 timing,大部分时间里,NVIDIA hardware encoder 内部大约是 3.5 milliseconds,Intel decoder 大约是 2 milliseconds。所以 encoder 加 decoder 已经是 6 milliseconds 了。为了继续降下去,我们要么需要其他类型的 codecs,要么需要更快、更好的 encoder。但 4 milliseconds 会是圣杯。

A

这挺夸张的。不过我很喜欢。我觉得还没人做到过,对吧?这很快。

C

是可以做到的。

B

过去可以用定制硬件、SDI、专业硬件来做到,但我希望它能通过互联网工作。我希望它能适用于任何 robot,比如里面只有一个小型 Jetson Nano 或 N150 的 robot。因为未来会有数以百万计的 robot 或 drone,它们可能是轮式 robot、飞行 robot,或者水下 robot。说到底,就是你控制的一台机器。为此,你要么需要 teleoperate(远程操控)它们,要么在一切都完全 autonomous(自主)之后,你也需要 tele-observe(远程观察)它们。你需要检查正在发生什么。在我看来,未来所有这些远程汽车都会由一个 AI model 来 tele-observe,它只会判断:一切正常。如果不正常,就提示:这里有问题。然后再由 operator(操作员)接手。这关系到 safety(安全)。当你的 humanoid(人形机器人)在照顾你的奶奶或我的奶奶时,我希望确保一切顺利,不会出现 robot 变得危险的可怕场景。或者当我开车时,我希望车该停的时候就停;如果需要,就有人接管处理。所以 real-time(实时)相关的 case 和 scenario 非常多。Kiber 的目标,就是让机器的 real-time control(实时控制)不再受距离影响。

A

这很了不起。而且我们一直在谈的一些技术、一些想法,和你正在做的事情是相通的。

B

对我来说,这个挑战非常大。我会说,在 video(视频)方面我还算可以,但 networking(网络)方面我还有太多要学。比如 congestion protocol(拥塞协议)、real-time bitrate adaptation(实时码率自适应)。但这也挺有意思。所以我创建了这个项目,当然也在美国完成了融资。但它是 open source(开源)的,这一点很重要。我们前面还没说过:Kyber 上的一切都是 open source。

A

那你怎么赚钱?

B

采用 dual license(双许可证),commercial 和 AGPL。你还记得你刚才关于 license 的说法吧?基本上,如果你想在自己的产品中使用 Kyber,就必须让整个产品 open source。如果你想使用这项技术但不 open source,就支付 commercial license 费用。所以小团队、hobbyist(业余爱好者)以及非常小的开发者都可以用这项技术,构建一些 open source 又有意思的东西。如果你是大公司,就会获得 support、所有 IP、修改权等等。所以这很不错。而且我自己也在做 robot,我很喜欢这件事。我们有一台 rover(漫游车)是 3D printed(3D 打印)的。我们正在完成一个 demo,是一个真正的 wing,类似 drone wing,也完全是 3D printed。我们还在尝试做一艘 3D printed sailboat(帆船),也会做一些 humanoid。当然,它们不会是特别好的 robot,这不是我们的本职工作,但我们是为了让所有人都能做 robot。很酷。

A

你真是找对人聊了。我很喜欢 robot。楼上就有一堆,而且 teleop(远程操作)会非常非常重要,尤其是当全球 robot 数量不断扩大时。完全同意。我们来聊聊 multimedia(多媒体)的未来。FFmpeg、VLC,还有一些 codec(编解码器),我们还没怎么提 AV2。能不能先说明一下 AV2 是什么?对它的期待是什么?H.265、H.266 又是什么?

B

AV1 是 Alliance for Open Media 做的 codec,这个联盟里有 Google、Netflix、Amazon、Apple、Videolan 等,我们想做一个 royalty-free(免版税)且质量很好的 codec。现在它正在部署。但实际上这个 codec 在 2018 年就已经完成了,只是一个 codec 要在广泛场景中被使用需要很多年。AV2 是这个 codec 的下一代,性能提升 30%。也就是说,如果保持相同 quality(质量),相比 AV1 可以减少 30% 的 bandwidth(带宽)。

A

David 和 AV2 有什么关系?

B

我们会做 David 2,我把它叫作 DeVID,因为 de 在法语里是“二”。而且你要知道,David 其实是一个 recursive acronym(递归首字母缩略词)。它的意思是 D,David is an AV1 decoder。

A

哦,不错,我都没想到这一点。大家也应该知道,David 是用 1 拼写的。

B

对。所以 David2 会用 2 来拼写,是 D-A-V-2-D。抱歉,我也不知道该怎么读。我们还在 CES 上做过一个 demo,展示 VLC 运行 AV2 的首个 demo。

A

你能给我解释一下 AV2 的 specification,以及 encoding 和 decoding 吗?

B

当然。specification 就是一份文档,用来说明这个 codec 应该如何工作。

A

这就是 AV2 本身。

B

这就是 AV2,就像 H.264 一样。然后你有 encoder(编码器)。目前的 encoder 叫 AVM,未来可能会有其他 encoder,可能有一个叫 SVT-AV2,这些都是 encoder。就像 H.264 有面向 H.264 的 encoder 一样。也像 x265 是 H.265 codec 的 encoder。AV1 的 decoder(解码器)是 David,AV2 的 decoder 是 David2,H.264 的 decoder 是 FFmpeg 里的 FFH.264,HEVC 的 decoder 是 FFmpeg 里的 FFHEVC。MPEG 世界在 H.264、H.265 之后还有下一代 codec,叫 H.266,也被称为 VVC。

A

所以 HEVC 是 H.265,VVC 是 H.266。为什么 H.266 很有吸引力,为什么好这么多?

B

我们经常遇到的问题是:为什么会有两个名字?因为大多数时候,这是 ISO 世界和 ITU 共同完成的工作。ITU 是 International Telecommunication Union(国际电信联盟)。

A

这是两个监管机构。

C

一个是私人实体,一个属于 United Nations。

A

哪个是私人实体?

C

ISO 是私人实体。

B

理论上,H.264 是 MPEG-4 Part 10,H.264。

A

H.264/AVC。

B

这就是完整名称。

A

明白。

C

所以它是 ISO 名称和 ITU 名称的拼接。虽然他们一起工作,但这背后有政治和历史因素。

B

HEVC 则是 MPEG-H.265 HEVC。

A

懂了。

B

还有 H.266,也叫 VVC。

A

能不能从高层概括一下它的改进?

B

每一代提升 30%,这是最好的概括。

A

这对 AV 系列 codec 和 H.264、H.265 系列都成立吗?

B

正在听我们说话的专业人士可能会想打我们,因为他们会说,不是,是 35%、25%、50% 等等。但总体上,你需要知道 HEVC 比 H.264 好 30%。H.265 比 H.265 好 30%——这里面有太多 case 和 scenario。比如在某些场景,尤其是 screen recording(屏幕录制),收益会非常大,因为你正好有适合那个场景的工具。所以对某个特定 video,新一代可能带来 70% 或 80% 的收益。以前 codec 的数量多得多,但现在用于 transmission(传输)的两条主要 codec 路线,一条是 H.264、H.265、H.266,另一条是 AV1、AV2。

A

我想主要差别之一是 encoding 的成本。

B

是的,还有 patent(专利)的 royalty(版税)。这也是为什么会出现 AV 版本 codec:它们尽可能做到 royalty-free,也就是尽可能不需要为 patent 付费。你需要知道一点,我们前面还没谈到:multimedia 是所谓的 patent minefield(专利雷区)。专利最多的两个领域,一个是所有与 3G、4G、5G、RF 相关的东西,另一个就是 multimedia。因为它非常数学化,可以获得很大的收益等等。所以 Google、Meta 和 Netflix 想要一种 royalty-free 的方案。也有人说他们在外部有相关 patent,但那些是 fringe patent(边缘专利)。所以总体上,说它基本上 patent-free 是成立的。

C

我们应该扩展 patent-free。AV1、AV2 在标准化过程中做了 patent checking,而在 MPEG 体系里,patents 甚至不会被讨论。patents 完全不在议题范围内。

A

能给我讲讲 patents 这边的情况吗?

B

通常 MPEG 会制定一种 format,对吧?然后所有人都会过来说,我有这个 format 的这些 patents,于是他们通常会组成一个联盟。这个联盟叫 MPEG-LA,也就是 MPEG Licensing Association。你把所有 patents 放进去,然后要求所有使用这个 format 的人付费。

A

等一下,能展开说说吗?拥有一个 codec 的 patent 是什么意思?为什么会有很多 patents?

B

设想我在做一件事:我不用正方形的 blocks,而是用 rectangles,对吧?

A

所以每个 idea 都有人去 patent?把它申请成 patent。

B

是的。

A

天哪。

B

是的。

A

天哪。人们和他们的……这得养活多少律师——

C

这确实养活了很多律师,对吧?

B

最大的问题不是这个。因为在 H.264 时代,patents 还可以说是相对正常的。但里面的钱太多了,所以到了 HEVC,specification 里被塞进了大量东西,其中很多在 99.9% 的情况下都没用,只是为了让某个人可以在上面加一个 patent。于是 HEVC licensing 变成了 MPEG-LA,加上另一个 patent pool,叫 HEVC Advance,另外我记得 Nokia 还在 patent pool 之外。

C

对,有几个在外面,还有别的公司。

B

所以几乎没法 license。几个月前,HP 好像决定在他们的 Windows laptops 里移除 HEVC 支持,因为这些 patents 的成本在上升。事情发展到某个程度,还有没有上限的 patents。对 YouTube 或 Netflix 来说,每年 patent licensing 可能是数亿美元。于是他们说,既然每年要花 $100 million,那我还不如创建自己的 codec。然后他们就这么做了。这就是为什么会有 Open Media Alliance,也就是 Alliance for Open Media,我们也是其中一员。它创建了 AV1,也在创建 AV2。我们也创建 audio codecs。主要区别就在这里。而且因为你需要绕开 patents,或者做一些没有被 patent 的东西,所以很多地方都会不同。30 年前 MPEG-2 里做的那些基础东西当然已经过了 patent 期。但比如说,golden frame、S-frame、B-frame,或者不同类型的——

A

这些都是被 patent 的 ideas。

C

对,不是,它有点像 “I Can't Believe It's Not Butter”。“I Can't Believe It's Not a B-frame”。某种意义上就是这样。它像是——

A

所以它是 B-frame 的一个不同变体。

C

对,就是为了尽量绕开这类东西。

B

所以你需要双重创造力:一方面是提高效率的创造力,另一方面是确保不侵犯现有 patents 的创造力。比如 VVC 拥有 HEVC 的所有 patents,再加上新的 patents。而 AV2 则尽量做到 royalty-free。

A

FFmpeg 和 VLC 在多大程度上需要考虑这些事?

B

我们不考虑。VLC 在法国的原因之一,就是法国不承认 software patents。所以这些 patents 大多在法国是非法的。因为我曾经算过,如果我要为 VLC 支付所有 licensing fee,每个用户要付超过 €200,换成美元也差不多。但这些 patents 在欧洲大多无效,因为它们基本上属于 mathematical patents 或 idea patents,在欧洲不被承认。

A

我从高层面补充问一句,只是出于好奇。网上、X 和 Twitter 这些地方的 meme,还有我自己的感受——我有一些欧洲朋友——大家觉得欧洲对 entrepreneurship 不友好。监管过多,bureaucracy 太重等等。有没有什么积极的方面可以说?欧洲未来的 entrepreneurship 还有希望吗?从技术角度看,欧洲是不是已经结束了?

C

看看我们两个人就行了,对吧?这期 podcast 里有两个来自欧洲大陆的人在谈 video,这本身就很说明问题。可以说这个 community 的重心很明显。

B

你可能还没有看到的是,欧洲出现了新一代 entrepreneurs,尤其是在法国。UK 很早就做到了,因为它更偏 Anglophone,更接近 Anglo-Saxon 的商业方式和对 business 的看法。但尤其是法国发生的变化。当然,有时凡事都被称为 French tech,确实有点过度。不过今天,大多数进入市场的人都想创建 startups。15 年前不是这样。那时大家都想去大公司工作,因为比如在法国,20 年前、15 年前,如果你失败了,把公司做没了——这对 startup 来说很正常——你就不被允许再创建新公司。那时有很强的 stigma。现在这种 stigma 已经消失了。法国在 AI 等领域发生了很多事情。当然,overregulations 是存在的,我知道,我自己就是 entrepreneur,但它也有一些好的方面。

A

我是说,会不会有一些让人动弹不得的因素?比如我后来关系比较近的一个人,Paul Adurov,他被法国政府直接指责,说他的所谓 platform 承载了某些内容。我可以想象类似的事情发生在 VLC 身上,比如 VLC 因为人们观看的某些 videos 而被指责。

B

他们试过。我们确实遇到过问题。

A

我的意思是,这就是人们担心的压力。因为如果你必须考虑这些事情,而你本来只是专注于——

B

不,你不会去想这些。这也没问题,对吧?

A

但如果他们来了呢?如果他们上门,而你没有 office 呢?

B

Videolan 没有 office。

A

我是说,这就是 Pablo 身上发生的事。他们逮捕了他,对吧?因为某些 videos,或者 platform 上分享的某些 content。

B

当然。但我没有 platform。一切都在 client side。

A

对,但他们还是可以逮捕你。

B

以什么理由?我没有分享任何东西。content 不经过我的东西。

A

当然。但问题是仍然会有 lawyer fees。

B

是的,这没错。

A

还有 paperwork。所以实际上,如果你有无限多的钱,几万亿美元,你会很容易赢,因为你站在正确的一边。但问题是,他们可以在某种程度上用 paperwork 压垮你。这就是 bureaucracy 的坏处,通过 paperwork,通过 process。你知道,就是那种 Kafkaesque 的东西。

B

你要意识到,比如在法国或欧洲大部分地区,有一个好处是:回应 court order 不会让你破产。它不像美国,那里真的可能让你破产。法律系统的运作方式是这样的:我每周都会收到 lawyers' letters,对吧?我可以告诉你,Videolan 每年的 lawyer fees 不到 $10,000。所以这并不真的吓人。

A

类似 Paweł 的情况,intelligence agencies 有没有试过对你说,能不能在 VLC 里放一个 backdoor?

B

有。两个机构。

A

你怎么回答?

B

不行。而且我当时远没有这么礼貌。

A

我懂了。

B

对。

A

你基本上是在说,绝对不行。

B

如果我们不得不破坏自己的 software,那我们会把它关掉。这一点很明确。

A

那“破坏”的定义是什么?比如允许某个政府开后门?

B

任何进入 VLC 的 code,都必须在我们的控制之下。至于我们编译 VLC 的方式,你可能会觉得我完全是偏执。比如,我们在离线机器上编译,第一步是先编译 compiler。我们在从未连接过 internet 的环境里离线完成所有事情。我们的签名方式有双重签名,尤其是因为,举例来说,我们见过、也相信有一个非西方世界的政府机构试图把一个 fake binary 推进我们自己的服务器。这让我们很警惕。而 VideoLAN 是 open source。你怎么杀死它?比如我搬走,对吧?我搬到 Malta,搬到 Cayman Islands 之类的地方,改掉 domain name,然后重新开始。VLC 是一个工具。它是一个帮助人们做事的工具。我们不是 platform。至于专利,我很抱歉,但大多数专利,你本来就不应该能给数学和矩阵申请专利。这是不对的。

A

VLC 会不会审查它能播放的视频类型,而不是基于视频内容?

B

不会,从来不会。我们从不这么做,因为 VLC 完全离线,不和任何服务器通信。所以我们根本不知道你拿这个 software 做什么。

A

所以同样地,没有哪个政府能说,比如法国政府过来说,我们觉得 anime 对社会有害,我们不希望任何 anime 被允许播放。

B

不,他们不能这么做。而且他们也会尝试说,嘿,我想知道某个人是否看过那类视频。答案就是:不知道。

A

所以这个也不行。也就是说 surveillance 也不行。

B

不行,因为我们唯一的 infrastructure 是下载 infrastructure。VLC 里没有 telemetry,对吧?

C

由于它的国际性质,这会很难。你们很难把那样的 code 合进去,因为 VideoLAN 里会有英国的人、德国的人、美国的人看到它。这会极其困难。

B

我们唯一能做的,也确实发生过的,是我们曾经遇到一个情况:美国某地的警方说,我们有一起谋杀案,这个文件损坏了,或者在那个版本的 VLC 里播放不了。你们能帮忙吗?我们从来不会接触视频本身。这就像普通 support 一样。

A

所以真的只是关于播放这个文件?

B

是的。我还记得 Afghan war 期间,我收到过一封来自军方某人的 email。我不记得他的军衔了。内容大概是:最新版 VLC 有个大问题,因为它不能正确播放我们某个 RTSP server 上的文件,而那里有所有电影。他说 VLC 对地面部队的士气非常重要。因为到了晚上,我想可能会很无聊,所以他们有一批视频或电影可以在那里看。当然,是我做了一次 update,破坏了某些 RTSP support。于是我给了他们一个专门的版本,因为这很重要。而且因为 VLC 完全 open source,我认为它被允许安装在 US Army laptops 上。我猜美国军方有人实际看过它,然后说,好,这没问题。我们记录处理流程的方式也没问题。所以我们和 authorities 合作的唯一方式,就是帮他们做 support。

A

这太了不起了。真的很了不起。这个故事很精彩。

B

我们看不到人们如何使用它。人们使用 VLC,这一点很强。

A

你会因此感到压力吗?首先,有数百万人在用它。其次,军方也在用它,也许有时还有来自政府的压力。你们团队很小,对吧?

C

是的。

A

VLC 有多大,比如 core contributors?有多少人?

B

6 个,8 个。所有法律事务都只有我一个人处理。凡是 legal 的事情都只有我。

A

你不会因此有压力吗?

B

我以前对此压力很大。

A

是啊。

B

但问题是,我们是在为所有人、为更大的公共利益做我们能做的事情。我们做的工作,是把一些极其复杂的 technology 变得让每个人都容易使用。我们是一个工具,而每个工具都会被用来做好事,也会被用来做坏事。你不能责怪工具,我认为这一点非常重要。以前我压力很大,现在不会了。

A

你保持这种 zen 的秘诀是什么?我的意思是,在我和你一次次聊天中,包括今天谈到每一个甚至紧张的话题时,你都很 zen。这种 zen 的来源是什么?

B

我有一种思考方式,就是总去想最坏情况是什么。总是 worst-case scenario。最后的答案是,如果我像 chess player 那样思考,最终我会死吗?是还是不是?我会一直这样想。这也是我做 startup 的方式。我在这里是为了做出好的东西。最坏情况是什么?公司破产。生活就是这样。公司会生,也会死。没关系。所以我的道德判断总是:最后我会死吗?我在伤害某个人吗?如果答案是否,那就算了。比如,有些律师会不高兴。那他们能怎样?拿走 VideoLAN 的所有钱?哇,他们能拿到 50,000 美元。真厉害,对吧?他们拿这能做什么?source code 已经在那里了,它是不可阻止的。也因为我们做的事情是好的,而且是为所有人做的。这很美。

A

Kieran,你说过有一个活跃的 archiving、preservation、moderation community。我觉得这非常有意思。你写到他们预算紧张,但他们认为 FFmpeg 作为 Rosetta Stone 极其重要,这样 multimedia 在一千年后仍然可以被播放。我的意思是,把 FFmpeg、VLC 看作保存视觉知识的工具,这是很好的视角。

C

是的,open source multimedia 里最好的 community 之一,主要由一位叫 Dave Rice 的人带领。我提一下他。我想他来自 City University of New York,就是 archiving community。他们做了很多事情。他们重视 open source,第一是因为他们确实预算不足,第二是因为他们认为归档 video 对世界很重要,但能够播放这些内容是一个大问题。英国有个很有名的东西叫 New Doomsday Book,他们把很多内容归档在 BBC microcomputers 上,但在 10 到 15 年内,就没人有合适的 software 能播放它了。我记得可能是 20 年左右。后来有人不得不去 reverse engineer 它。那才 20 年。想象一下 1,000 年后会怎样。我认为 FFmpeg 的一个优点是它用 C 写成。C 大概是你能得到的最接近数学、最接近逻辑的东西。

B

你觉得 1,000 年后我们还会有 C compilers 吗?

C

是的。我们现在有一些语言,变化并不大。我们也有数学——数学记号一直存在。它会像 Latin 一样。C 会像 Latin 一样。它会成为一种你从过去学习的东西,但在某些语境中仍然可用。所以归档社区在实践上真的很出色。他们同样经费有限,但他们资助了 FFV1 codec 的开发。那是一个 lossless codec。所以归档社区非常担心 compression 这个行为会丢失东西。而且他们的担心是有道理的。如果压缩得太狠,可能会改变材料的呈现。这里那里可能会有细微差异。所以他们非常在意,不只是要压缩得好,还要 lossless,并且要快。因此他们与 FFmpeg 合作,开发了一个全新的 codec,专门用于快速的基于软件的 encoding。他们也非常关注 resilience。比如他们把内容存到磁带或其他硬盘上,如果丢了一些 bit,我需要快速恢复。我不能因为丢了一个 bit 就丢掉整个 GOP,大概就是这种情况。所以他们是一群非常好的人。他们资助了 FFmpeg 中的 GPU encoding,让 FFV1 encode 更快。这件事真正的目标,是以可用的方式保存世界的多媒体遗产。世界各地有很多优秀团队和归档组织都选择了 FFmpeg 和 FFV1 作为他们的归档方案。他们也能给我们提供非常专业的建议。他们会解释说,1950 年代,在某种特定类型的磁带上,colorimetry 是这样做的。因此这里有一个需要处理的 special case,而你在其他地方根本不会遇到。

B

他们懂一些我们不懂的视频知识。每次我和 Dave Rice,或者 British Film Archive 的人交流,都会学到新东西。而我已经做 video 做了 20 年。尤其是在 colorimetry 和颜色方面,他们懂得特别多。

C

Storage,还有这些其他方面。

A

我的意思是,他们对内容本身、对 video 本身有非常深的理解和珍视。尤其是当你考虑 lossless 的时候,他们非常害怕丢失这个东西中某种本质性的内容。也正因为如此,他们对要被保存的东西有很深的理解。而当你执着于 encoding 之类的具体技术时,有时可能不会这样去想。

B

而当你进入 film scanner 这个 rabbit hole 的时候,对吧?你把那些东西拿来转成 digital,这本身就是一个很大的话题,光这个话题就可以再录 5 个小时播客。

C

而且有大量 film 需要归档。Film 正在退化,也许没有存放在正确的环境里。另一点是,因为这是 open source,他们也会把这些东西、这些 workflow 交给那些负担不起归档机构的国家。在那里,归档是由志愿者做的,或者通过其他方式完成。他们会去教学,比如在 India,他们教孩子们使用 FFmpeg commands。他们真的很了不起。他们就是我们想要实现的那种模范社区、模范 ethos。他们是一群很好的人,非常愿意参与,并成为更大事业的一部分,因为他们意识到,他们现在做的工作,在 1,000 年后会说明很多事情。1,000 年后,我们可能会淹没在 AI slop 里。这些东西需要被重视,并且被妥善归档。那时的人会想知道:生活曾经是什么样的?

A

是的,感觉捕捉 20 世纪和 21 世纪很重要,因为这像是一个转折点:我们从 data 稀缺走向 slop ocean,走向大量 slop 的生产。这个转折点很值得归档。

B

但人们没有意识到,我们今天正在失去大量 film。来自 30 年代、40 年代、50 年代的很多东西,当时被认为没有价值。

C

还有 tape,70 年代和 80 年代有大量 tape,而全世界没有足够的 tape heads 来读取所有这些 tape。所以他们必须决定要归档什么,然后把剩下的 tape 扔掉。围绕这个话题存在巨大的 moral hazard,我暂且这么说。因为这是人类历史的 digital record,而他们必须做出取舍。而且还涉及 digital stewardship,我也许可以这么说——这个词是我现编的,不算真正的术语——就是要确保世界能够以一种人人都能播放的形式拥有这些信息,而不是只能在某个已经不存在的设备上播放。

A

而且现实地说,这有点像 needle in the haystack。归档所有这些 footage 很有价值,然后随着时间推移,我们可以找到那些我们现在还不知道存在的宝藏。

C

比如说,那个角落里其实有东西,只是我们当时没有——

A

是的。

C

而它本来会因为某个小细节被 compression 掉。

B

哦,哇。

C

那里确实有东西。所以他们确保它是 lossless。他们可以在数学上证明它是 lossless。他们可以针对 bit 丢失做不同的 trade-off——如果有一个 bit 丢了,一个 single bit flips,我可以确保只丢失某一帧的一部分。我们可以做 error recovery,他们也可以对之前的帧做 error recovery。他们可以做各种不同的事情。

A

你觉得 VLC 和 FFmpeg 在 100 年后还会存在吗?

B

FFmpeg 会。VLC 也许会。

A

FFmpeg 的未来是什么,它会走向哪里?VLC 会走向哪里?如果你考虑接下来 5 年、10 年、20 年。

B

5 年、10 年很容易。问题在那之后,对吧?问题是,我们会不会走向一种叫 holograms 的东西?

A

是的,所以 VLC 和 FFmpeg 会扩展到任何 multimedia 吗?

B

会。

A

所以 multimedia 可能会变成——抱歉,我把话题扩得有点像 pothead——但如果你看 Neuralink 这样的 brain-computer interfaces,很可能我们开始消费的 multimedia,会变成任何 codec、任何 data,只要是我们的 brain 想通过 brain-computer interfaces 消费的东西。这是一方面。然后当然还有 virtual reality。你会有面向 Neuralink 的 VLC。

C

然后你会有 FFmpeg -i input-format human-brain。

A

是的。会有给 brain 用的 codecs。

B

是的。

C

当然,100%。

B

当然。我的意思是,今天已经有一些新的 codecs,比如用于我们所说的 point cloud,或者 volumetric videos 的 codecs。现在有大量关于所谓 RGBD 的研究,对吧?也就是用于 depth 的 codecs,这对 robotics 和 3D 内容很有用。还有用于压缩 3D elements 的 codecs 的回归。

C

还有用于 astronomy 的 compression。

B

例如在 VLC 上,我们也已经有 VR 和 XR 版本的 VLC。还有在 Kyber 上,对吧?我们提到 Kyber。在 Kyber 上,我们也在做 XR content 的 streaming,用于那些算力不够的 glasses,或者 Apple Vision、Quest 里面。所以我们已经在做 3D、XR、interactive、low latency 的 streaming。还有一种叫 volumetric video、point cloud videos 的东西。所以它不会停下来。是的,在某个时刻,它们会在 VLC 和 FFmpeg 里面管理 3D data,对吧?这是显然的。

A

所以这就是它前进的方向。社区是开放的。

B

社区里不是每个人都看到了这一点,但像 Kieran 和我,我们是 entrepreneurs,我们知道它会往哪里走。我们看得到。

A

所以我想 FFmpeg 内部可能会有一种张力。就像有人会说,听着各位,我们真的很擅长做 video 和 audio,为什么要扩展?我们就做好自己擅长的事不就好了。

B

要回答这个问题,我们需要先回答 multimedia 的定义是什么。

A

是的。

B

Multimedia 是面向人类感官的多路 stream 的数字表示。我们会做到这一点。想象一下,现在有一种方式,不再使用 mic,而是使用气味传感器和气味扩散器。它会进入 FFmpeg。

A

所以你的 demuxer 有了一个新的——

B

是的,当然。你的 demuxer 会有一种新的 track type,基本上就是气味。还有嗅觉、触觉。它就像 audio 一样。

C

你会需要左鼻和右鼻 track。你已经有一对左右 audio 了,很简单。

B

是的,当然。

A

立体声气味。

C

立体声气味,对。

B

比如在 VLC 里,我们已经有一个 haptic plugin。它主要用于我们所说的 4D cinemas。你知道,就是那些装在 hydraulic——我不知道这个词怎么说。

C

Hydraulic arms。液压臂。

B

对,所有东西都在动,就像主题公园里的那种。然后会有一个同步的 data feed,本质上是在传输这些信息。

A

现在已经有相关 standard 了吗?

B

有很多 standard。

A

你真让我开心。

B

所以当然,我们有一个 plugin,不在 VLC 的普通版本里,它基本上负责传输这些类型的 movement,也就是物理 movement,也就是 haptic movement。它是人类感官的一部分,所以它会被纳入进来。

A

这个未来很让人期待。那当初是怎么做到的?我是说,开发者 community 很小。你们怎么完成这些?如果你是 FFmpeg 或 VLC 的 contributor,感觉压力会很大。光看 Twitter 就会觉得,要让它在这么多不同 operating systems 上工作,是巨量的工作,投入也很惊人。

B

不,要从相反的方向看。我们不是 contributors,我们是 maintainers。也就是说,我们为所有人维护。比如每年大约有 150 人为 VLC 贡献,可能有 300 人为 FFmpeg 贡献。我们这个小团队的目标,是把所有 contributions 合进来。所以如果 usage 更多,就会有更多 contributions,而这些人会去做正确的 modules、新 formats 等等。我们关心的是 architecture。VLC 的 architecture,FFmpeg 的 architecture。现在我们在 VLC 做 spatial audio。不久前我们做过 demo。architecture 需要一些 changes,我们做了第一个 spatial audio module。等要加第二个时就会容易,第三个也会容易。我们的目标,对 ODOZ 或 AptX 也是一样。我们需要在 architecture 上工作,让 modules 可以被添加进来,以增加未来的 capabilities。所以是的,我们会继续做,我们是 multimedia frameworks。这不只是 audio 和 video,而是一切有 timing、并且表示某种你可以感知的东西。如果是 brainwaves,那就会是 brainwaves。

C

我觉得这是不可避免的。

A

抱歉。我从很多方面都很喜欢这一点,因为 FFmpeg 和 VLC 正在推动公司、推动世界走向 standardize。比如说 standardize brainwaves。它会推动标准化。我希望 Neuralink 能为通过 brain-computer interfaces 的 multimedia,或者带 haptic 的 robots,提出一个 standard。

B

按经验来看,事情总是一样的。开始时,这是一个新话题。会出现大概 5 种不同 standards,因为每个人都开始做。然后 hype 降下来。每次 hype 降下来后,人们就会开始说,好吧,你知道吗,我们需要做一个 standard。通常是 2 到 3 家公司,不是 leader,而是 2 到 3 个 followers,一起做一个 standard。然后我们实现这个 standard,曲线也就到末端了。它开始变得更成熟。

A

然后 leader 也会多少被推着加入,因为采用 standard 更好。

B

比如 3D audio。

A

对。

B

6、7 年前,一切都围绕 3D。Android 上有 Cardboard。你有两种 audio formats,现在都死了。现在它又带着真实 use cases 回来了,而且我们会从过去 standard 的错误中吸取教训。所以到处都会是这样。

A

也就是说尽量避免 closed。我在某处看到过,你对 Dolby 没说太多好话。

B

是的,我没有。

A

那是什么原因?你能不能给我讲讲,他们走到哪一步了,做了什么不好,让你生气?

B

它曾经是一家很了不起的公司,做了大量很好的事情,有很优秀的 engineers。他们定义了 sound 是什么。现在基本上变成了 lawyers 和 licensing。

A

所以他们在封闭东西。他们在试图买下东西。

B

不,只是他们不像过去那样创新了,等等。有点像,抱歉这么说,像 HP。

A

既然我们在不同语境下聊了很多 Twitter,你有没有最喜欢的,或者最不喜欢的、最尴尬的 tweet,来自 VideoLAN 或 FFmpeg 的 Twitter?

C

我最喜欢的有两个。一个是“talk is cheap, send patches”。我觉得它体现了很多我们前面聊到的东西:如果没人去做,东西就不会被 built。它不会凭空出现。另一个我喜欢的是“FFmpeg, nothing is beyond our reach”。我觉得这来自一个美国 military satellite patch,他们好像发明了某种能看到整个世界的 monitoring system,然后发布时用了这句话。

B

不是还有一次 FFmpeg 跑在 Mars 上的 rover 里吗?

C

对,FFmpeg 被 Mars rover 使用,Mars 2020 rover 用它来压缩图片。他们很想这样做,也写了一篇 paper,而且他们非常希望尽可能使用 commercial off-the-shelf technology。FFmpeg 运行在 Mars 上。所以我们是一个 multi-planetary open source library。

A

不错。

B

我们经常看到有人在奇怪的地方使用 VLC 的 tweets。很多做 Formula One 的人,在所有 paddocks 里都用 VLC 播放 live feed。我们见过 European Space Agency,也见过 SpaceX 用 VLC 监控 launches,这会让你很开心。

A

我还见过 particle accelerator。

B

对。对我来说,最难忘的经历之一,是去 CERN 的 LHC,因为他们用 VLC 监控环上的所有 captures。那个环有 27 公里。所以他们有一些 analog cameras,并且用一些 capture cards 把 analog 转到 VLC,这样 VLC 就可以在他们的 multicast network 上 stream,让整个 CERN 都能访问。我在 2010 年和 Laurent 一起去参观了那里,我们大概一小时就修好了他们的问题。因为只是一些 parameters,当时可能文档写得不太好。然后他说,好,剩下一整天你想做什么?于是我们参观了所有东西,包括 antimatter、colliders 等等。那是我物理背景里最难忘的一天之一。

A

对,它真的是到处都在用。Kieran,有没有什么 tweets 是你后悔发的?

C

我后悔的 tweets?

A

或者就像那首法国歌怎么唱的?不后悔?

C

Je ne regrette rien。

B

是的,这对我很重要。

A

什么都不后悔。

B

不,因为 regrets 是对你 mind 的一种 tax。要从 mistakes 中学习,但不要 regret,因为你已经做了。除非你有 time machine 可以回到过去,否则不要 regret。它只会消耗你的 brain。要从 mistake 中学习,当然。但不要 regret。

A

这让我想起一句话,很好,“对你的 brain 征税”。它让我想起我看到的 Johnny Depp 的 quote,他说,hate,我不 hate。Hate 是一种非常昂贵的 emotion。

B

你是在拿我和 Johnny Depp 比吗?因为那会是你的第一次。

A

好吧,先生们,正如我刚才说的,我一直非常感谢你们两位以及更大的社区参与构建的这些软件,包括 FFmpeg、VLC 以及其他一切。我也一直很感谢那些辛辣的 tweets。请不要停。也感谢你们今天愿意和我聊,还送我这顶很帅的帽子。我感觉自己像个巫师,感觉很特别。能有机会来聊一聊、庆祝这款多年来给我带来很多快乐的软件,我也觉得很特别。所以谢谢你们所做的一切,也谢谢你们今天来聊天。

C

谢谢你邀请我。

B

非常感谢。

A

感谢收听这期与 Jean-Baptiste Kempf 和 Kieran Cunha 的对话。若想支持这个 podcast,请查看描述中的赞助商信息,那里也有联系我的链接,可以提问、反馈等等。现在,我想用传奇人物 Linus Torvalds 的几句话作为结尾:大多数优秀程序员写程序,并不是因为期待获得报酬,或得到公众的赞美,而是因为编程很有趣。感谢收听,希望下次再见。

译自 Lex Fridman Podcast · 录于 二〇二六年五月七日