本文来自微信公众号: 每日天使 ,作者:每日天使
FFmpeg是一个开源的跨平台音视频处理工具集,能够解码、编码、转码、流传输和播放几乎所有曾经被创造出来的视频或音频格式。它是YouTube、Netflix、Chrome、VLC、Discord以及几乎所有涉及音视频的互联网平台的底层引擎。据估计,超过90%的在线和离线视频处理工作流都涉及FFmpeg。
VLC则是另一个传奇级的开源媒体播放器,能够播放任何格式、任何平台上的媒体文件,没有广告、没有追踪。它的下载量已超过65亿次,其标志性的橙色交通锥图标已成为全球数字文化的一部分。
本次访谈的两位嘉宾:让-巴蒂斯特·坎普夫(Jean-Baptiste Kempf)是VideoLAN的主席,是VLC和FFmpeg背后的关键人物;基兰·库尼亚(Kieran Kunhya)是FFmpeg的长期贡献者,也是Twitter/X上那个著名的FFmpeg账号的运营者——以犀利的推文和无条件捍卫开源精神而闻名。在长达4个多小时的对话中,他们深入探讨了视频编解码技术、开源社区文化、手写汇编的艺术,以及那些支撑现代数字文明的"隐形基础设施"背后的故事。
QA正文
一、传奇软件
莱克斯:传说VLC可以打开一切。你知道它能打开的最奇怪的东西是什么?
让-巴蒂斯特:有很多人用VLC来录制VHS录像带。你只需要插上一张采集卡,VLC就能播放那些信号。我们最近还专门花了一整个夏天来开发DVD Audio支持。当然还有FFmpeg支持的所有那些奇怪的游戏编解码器。
基兰:有一个《星球大战》视频游戏,有人专门实现了其中前10秒的片头序列,并确保在一张光盘上的比特级精确还原。
让-巴蒂斯特:有一次在VideoLAN大会上,我们还举办了一个比赛——看谁能造出最奇怪、最恐怖的文件,然后看VLC能不能打开。最终是一个MKV文件获胜,它的每一帧都在改变分辨率、宽高比和旋转角度。还有一个文件,整个视频其实都是动画字幕——每一帧都是黑底,但上面叠加了一帧一帧变化的SSA字幕。还有一个文件同时是合法的ZIP和合法的MP3。
莱克斯:对不了解VLC的人来说,我头上戴的这顶帽子,这交通锥标志能算是史上最好也最糟的标志吗?
让-巴蒂斯特:绝对是。VLC的标志太有标志性了。我们是一个很小的团队,但这个图标全世界都知道。我去印度或中国的偏远地方,人们都认识这个交通锥。我们网站25%的流量来自搜索"cone player"的人。很多人不知道VLC,但他们知道"锥子播放器"。有一次我们开玩笑说要换标志,说改成一种推土机,在愚人节那天发了出去,结果收到了大约一万封邮件说"不要换标志"。
莱克斯:这个标志很荒谬、很荒诞、很搞笑,它变成了一个迷因,迷因变成了文化,然后你就一直留着它。你知道20年后人们还是会认出这个交通锥,会说"哦对,那是一个视频播放器"。
二、视频管线
莱克斯:当我们按下播放键时,到底发生了什么?从文件或流到屏幕上的像素和扬声器里的声音,主要有哪些阶段?
让-巴蒂斯特:第一个阶段是从一个地址——也就是你给的一个URL——获取字节流。这可以是HTTP、文件、DVD等。你给媒体路径,它给你数据流。然后这个流需要被容器切割——也就是解复用器(demuxer)。它从操作系统中一块一块地获取数据,开始把这些数据切割成压缩的视频帧和音频帧。
基兰:然后需要做简单的视频帧解析,主要是为了判断这个编解码器是否可以用GPU解码,或者需要退回到软件解码。人们通常认为GPU能播放所有东西,但实际上高达45%的文件是无法GPU解码的。这些文件需要被探测、被检测,不同厂商的GPU可能有不同的限制。
让-巴蒂斯特:解复用之后,你就有了压缩的数据——音频和视频。视频数据需要被发送给解码器,音频数据也是一样。解码器会将压缩的数据转化为原始的像素数据。然后这些像素数据会被进行颜色空间转换,最终送到GPU上进行渲染和显示。音频数据则会被送到音频输出设备。
三、编解码原理
莱克斯:什么是编解码器?它是如何实现100倍甚至1000倍压缩的?
基兰:视频的本质是什么?就是一堆像素,每个像素有RGB三个值,你有一个像素网格,每秒有24帧或30帧或60帧。问题在于——如何把所有这些数据压缩存储?核心思路是利用冗余信息。比如你看到一片云,从这一帧到下一帧云还是一样的,这就是冗余——你只需要存一次。再比如我身后这个黑色背景,整个画面都是一样的黑色,你只需要说"把左上角的像素值复制到整个画面"就行了。
让-巴蒂斯特:你还可以跨帧复用——第一帧的信息可以在后续很多帧中重复使用。理论上这是无限的,但实际上受限于内存和计算能力。如果你要在4K分辨率下比较200帧之前的像素,那计算量是巨大的,而且解压时也要做同样的事情。
莱克斯:1000倍压缩?
让-巴蒂斯特:1000倍。目标就是1000倍。编码和解码是一个耦合的过程,但它们是不同的权衡——你是要压缩更多但解码更难?还是要编码更快但客户端花更多时间?这就是为什么有那么多不同的编解码器。
基兰:更复杂的是,像AV1、AV2或VVC这样的现代编解码器,严格来说不是单一的编解码器——它们是工具的集合。里面包含多个不同的编码工具,根据不同的图像内容来选择最优方案。
四、硬件解码
莱克斯:关于GPU硬件解码,45%的文件无法硬件解码,这是怎么回事?
让-巴蒂斯特:人们很习惯地认为GPU能播放所有东西,会有硬件加速。但实际上,很多编解码器的变种、不同的配置文件,GPU可能不支持。不同GPU厂商对同一编解码器的支持也不同。而且很多时候,硬件解码器的质量不如软件解码器——你可能在画面上看到瑕疵。
基兰:还有一个问题是,硬件解码器通常不支持所有编解码器。很多新的或小众的编解码器,GPU根本不支持。这时候你就需要一个优秀的软件解码器。这就是为什么像Dav1d这样的项目如此重要——它是一个纯软件的AV1解码器,在CPU上实现了极高的性能。
莱克斯:所以当硬件不支持的时候,软件解码器就是你的后盾。
基兰:没错。而且即使有硬件支持,软件解码器在很多情况下也更好——它更灵活,支持更多特性,而且不受GPU厂商的限制。
五、手写汇编
莱克斯:我们来谈谈FFmpeg的Twitter账号上那些引发争议的推文。你发了什么?
基兰:我发了一张图,标题是"这就是顶级视频编解码器应该有的样子"——79.9%是汇编语言,19.6%是C语言,0.5%是其他。这是Dav1d项目的代码构成。
莱克斯:这引发了什么反应?
基兰:人们疯了。两年来一直有人跟我争论——"intrinsics(编译器内置函数)就够了"、"编译器的自动向量化可以做到"、"是你不会用,不是编译器不行"。我们展示了几百个手写汇编优于编译器输出的例子,他们的回应是"你写错了"。然后我们证明了不是我们写错了,是真的手写汇编更快。两年后,争论还在继续。
让-巴蒂斯特:FFmpeg整体有10万行汇编代码,而光Dav1d一个项目就有24万行手写汇编。这是VideoLAN的项目,每一行都是为性能而优化的。我们的座右铭是"每一个周期都重要",因为Dav1d用在VLC和一些软件AV1播放栈中,涉及大约30亿设备的视频解码。30%的Netflix视频现在是AV1格式,YouTube上50%也是AV1。
莱克斯:为什么手写汇编比编译器生成的代码更快?
基兰:因为编译器不了解上下文。你作为人类程序员,知道这段代码的特定用途、知道数据的模式、知道什么指令组合最有效。编译器做的是通用优化,但视频解码中有太多特定场景需要特定优化。每一纳秒的节省乘以30亿设备、乘以每秒60帧——这个数字是天文数字。
六、开源文化
莱克斯:FFmpeg的核心维护团队到底有多少人?
让-巴蒂斯特:核心社区大约10到15人。VLC的核心社区只有5人。FFmpeg的时间线上有大约1000个贡献者,但留下来的比例大概只有1%。人会换工作、结婚生子、遇到人生变故——他们很可能不会再回来。所以是我们这十几个人要维护所有人的代码。代码必须可维护、必须优秀。有时这意味着你需要重做你的工作——因为它不错,但不够优秀。
莱克斯:说到Linus Torvalds,他对代码质量的严格程度是出了名的。你怎么看?
让-巴蒂斯特:Linus是独一无二的。他非常严厉,但人们没看到的是,他严厉的对象通常是内核各部分的维护者——这些人了解他。他对每个人并不是都那么严厉。重要的是,他在自己房间里创造的东西现在运行着互联网上每一台服务器——连微软云Azure上70%-80%的服务器都跑Linux。你所有的Android手机都在跑Linux。他的成就令人惊叹。
基兰:代码审查的严格性是必要的。因为我们这么少的人要维护这么多关键基础设施,质量不能妥协。而且很多时候贡献者的母语不是英语,语气上可能显得比较直接,但这不一定是针对个人。在FFmpeg和VLC这样的开源社区中,对代码的批评通常就是对事不对人。
让-巴蒂斯特:这是一个亚文化。大多数FFmpeg和VLC社区的人每年都会参加VDD(VideoLAN Dev Days),在现实生活中他们非常有趣和友好。但在线上,沟通方式确实不同。你不能把在线上的沟通方式和线下等同起来。就像游戏文化一样,有时候看起来很激烈,但大家都理解这种方式。
七、X平台风波
莱克斯:FFmpeg的Twitter账号上那些充满争议的推文——跟Google的争论是怎么回事?
基兰:这是一个年轻人在Google工作,他说"嘿,开源项目还有其他运营方式"。我们只是在X上回应了一下——这就是这个账号的乐趣所在。关键是要告诉人们,这些不是大型企业的开源项目,不是Kubernetes那种有几百上千人拿着工资开发的项目。这些人就是在地下室里用业余时间做东西。
让-巴蒂斯特:与Google的关系比较复杂。Google是一个实体,但内部有很多不同的团队——YouTube、Chrome、Chrome Media等等,他们都是不同的。我们跟很多Google工程师一直有很好的合作。Theo那个事件确实有点过了——我给他打了电话,我说"好了,这太过分了"。但最终,这种争论对项目是有益的——开源社区的知名度在过去两年里大幅提升了。
基兰:我觉得应该把它看作一场说唱对决。我们在X上说stuff,对方也说stuff——但这不意味着真的有个人恩怨。而且如果你能通过这种有趣的方式教会人们关于开源项目的知识、关于汇编的知识,那这就是有价值的。
莱克斯:有意思的是,这种公开的争论实际上带来了积极的效果?
让-巴蒂斯特:捐赠增加了,关注度提高了,大家都开始讨论FFmpeg是什么。从这个角度看,X上的争论对整个开源社区都有好处。
八、David解码器
莱克斯:我们来好好聊聊Dav1d。这是一个什么样的项目?
让-巴蒂斯特:当AV1被推出时,Netflix、亚马逊、Mozilla都说"这个格式太复杂了,必须用硬件来解码"。但我和Ronald、Henrik、Martin等人说,我们需要一个极其优秀的软件解码器,因为硬件支持需要时间。于是我们创建了Dav1d。
基兰:这个项目可以用"超越疯狂"来形容。3万行C代码加上24万行手写汇编。为了让你有个概念,FFmpeg所有编解码器加起来大约有10万行汇编,而光Dav1d一个项目就有24万行。
让-巴蒂斯特:每一行汇编都为性能而优化,因为我们的座右铭是"每一周期都重要"。Dav1d用在VLC和一些软件AV1播放栈中,我们讨论的可能涉及大约30亿设备的视频解码。30%的Netflix视频现在是AV1格式,YouTube上50%也是AV1。而且很多设备没有硬件AV1解码器。有了Dav1d,我们发现在一两个CPU核心上就能正确解码720p视频。
莱克斯:这太不可思议了。一个由志愿者开发的开源项目,手写24万行汇编,服务于30亿设备的视频播放。
基兰:这就是开源的力量。
九、x264传奇
莱克斯:我们来聊聊x264,这个基本上驱动了整个互联网视频的编码器。
基兰:x264是H.264视频标准的编码器。它主导了互联网视频,也主导了蓝光光盘等其它领域。蓝光光盘很有意思,因为制作方真的很想要最高质量——很多顶级电影都是用x264编码的。x264是一个巨大的飞跃,因为它出现在正确的时间点——HD视频开始普及,Intel Core和Nehalem CPU变得足够快,可以实时编码视频。
莱克斯:它最核心的贡献是什么?
基兰:最核心的贡献是关注视觉质量而非数学指标。在此之前,行业和学术界20年来一直痴迷于峰值信噪比(PSNR)和均方误差(MSE)这样的数学指标。但MSE会导致模糊,因为它实际上是在最小化错误——但人眼感知到的东西和数学指标衡量的是不同的。x264改变了这一切,它开始关注"人眼觉得好看"而不是"数学上最优"。
让-巴蒂斯特:这在当时是革命性的。x264证明了,一个由志愿者开发的开源编码器,可以打败商业公司花大价钱开发的编码器。它的质量标准至今仍是行业标杆。
十、开源动力
莱克斯:是什么驱动着这些令人难以置信的贡献者?
让-巴蒂斯特:是编程本身的乐趣。这是你内在的驱动力——你看到了一个问题,你知道怎么解决它,你就去做了。不是为了钱,不是为了名,而是因为你觉得这很酷,这很有趣。
基兰:我11岁的时候在意大利佛罗伦萨住了一年,数学老师教我们用一种叫Logo的编程语言——屏幕上有一只海龟,你让它左转右转来画图形。从那以后我就知道我想做跟计算机有关的事情。后来我开始接触视频编码,发现这个领域充满了挑战和乐趣。
让-巴蒂斯特:很多人不理解——为什么要花这么多时间在免费的东西上?但对我们来说,这不是"免费"的。我们得到了学习、创造和被认可的机会。当你的代码被数十亿人使用时,那种满足感是任何金钱都买不到的。
基兰:而且这是一个完全基于实力的社区。我们不在乎你是谁、你来自哪里、你在哪家公司工作。我们只在乎一件事——你的代码好不好。也许你是一只狗,我们不在乎。我需要看你的代码,代码好就行。这是最纯粹的技术社区。
十一、远程渲染
莱克斯:我们来聊聊远程渲染和低延迟视频。这是做什么的?
让-巴蒂斯特:远程渲染就是你在本地运行一个程序(比如视频游戏),但实际的渲染和计算在远端服务器上完成,然后通过网络把画面传回来。你需要极低的延迟——目标是从屏幕捕获到显示的端到端延迟是4毫秒。
莱克斯:4毫秒?这是什么概念?
让-巴蒂斯特:4毫秒意味着240Hz。到目前为止,我们在Windows到Windows或Windows到Mac之间实现了7毫秒的延迟。在这个时间中,大约3.5毫秒花在NVIDIA硬件编码器上,大约2毫秒花在Intel解码器上——光编码加解码就已经6毫秒了。要降到4毫秒,我们需要更快的编解码器。
莱克斯:你们最近在CES上做了什么演示?
让-巴蒂斯特:我们在拉斯维加斯CES展会上做了一个演示——一辆全3D打印的火星车,有人从法国远程控制它。车上装了一个网络摄像头和一块很小的PCB板,把视频传到地球另一端。这展示了远程渲染的实际应用场景。未来你还可以想象AI控制大量无人机——所有这些都需要极致的视频编码和网络性能。每一个毫秒都很重要。
十二、VLC历史
莱克斯:VLC是怎么开始的?
让-巴蒂斯特:VLC最初是一个法国学生项目。1996年,巴黎中央理工学院的一群学生想要在校园网络上播放视频。当时没有好的跨平台视频播放器,所以他们决定自己写一个。最初的名称是"VideoLAN Client"——这就是VLC这个名字的由来。
莱克斯:交通锥标志是怎么来的?
让-巴蒂斯特:最初的标志收集工作是由我们的一位学生做的。交通锥的灵感来自École Centrale Paris的学生传统——他们有一个把交通锥作为纪念品的文化。当我们需要一个标志时,有人画了这个橙色交通锥,大家都觉得它很有趣、很独特,于是就保留了。现在它已经成为全球最有辨识度的软件图标之一。
莱克斯:你有没有想过换掉它?
让-巴蒂斯特:我们试过——在愚人节开玩笑说要换成推土机,结果收到了大约一万封抗议邮件。从那以后我们就知道,这个标志永远不能换了。
基兰:而且VLC没有广告、没有追踪、完全免费。65亿次下载,没有从用户身上赚一分钱。这在今天的互联网环境中几乎不可想象。
让-巴蒂斯特:这就是开源的力量——我们不需要从用户身上赚钱,因为我们的经费来自捐赠和企业赞助。我们的目标只是做一个好的播放器,仅此而已。
十三、视频未来
莱克斯:FFmpeg有没有在太空使用?
让-巴蒂斯特:FFmpeg运行在火星探测器上。NASA的Mars 2020火星车用FFmpeg来压缩从火星传回的图片。他们写了一篇论文,说他们尽量使用商业现成技术。所以FFmpeg是一个"多行星开源库"。
莱克斯:还有什么有趣的使用场景?
让-巴蒂斯特:VLC在很多意想不到的地方被使用。F1赛车的每个维修区都在用VLC播放实时画面。我们看到欧洲航天局、SpaceX在监控发射时使用VLC。最让我激动的一次是去参观大型强子对撞机(LHC)——他们也在用我们的软件。
莱克斯:关于杜比,你有什么想说的?
基兰:杜比曾经是一家伟大的公司,做了很多了不起的事情,有很棒的工程师。他们定义了什么是声音。但现在?基本上只剩下律师和授权了。他们不再像以前那样创新了。这有点像惠普。
让-巴蒂斯特:未来的视频技术会朝着更高的压缩比、更低的延迟、更智能的编码方向发展。AV2、VVC这些新一代编解码器会带来更好的性能。但不管技术怎么发展,FFmpeg和VLC这样的开源项目会一直是这个生态系统的基石。因为我们追求的不是商业利益,而是技术本身的卓越。
十四、结语感悟
莱克斯:有什么推文是你后悔的吗?
基兰:没有。就像那首法国歌里唱的——"Je ne regrette rien"——什么都不后悔。因为后悔是对你心灵的攻击。
让-巴蒂斯特:FFmpeg的Twitter账号有两句我最喜欢的格言。第一句是"Talk is cheap,send patches"——光说不练假把式,发补丁来。这体现了很多东西——东西不会自己出现,除非有人去做。另一句是"FFmpeg:nothing is beyond our reach"——据说这句话来源于一个美国军方卫星补丁,他们发明了一种可以监控整个世界的系统,然后把这个发布到了FFmpeg中。
莱克斯:FFmpeg确实运行在火星车上。
让-巴蒂斯特:是的。FFmpeg运行在火星上。所以我们是一个多行星开源库。
莱克斯:我想用Linus Torvalds的一句话来结束这期节目。他说过,大多数优秀的程序员做编程,不是因为期望得到报酬或公众的赞誉,而是因为编程本身就有趣。谢谢你们。
让-巴蒂斯特:谢谢。
基兰:谢谢。
