技术往事:从梅西举杯到世界热泪盈眶,那一秒钟我们经历了什么?_老师傅_画面_世界杯

浅友们好~我是史中,我的日常生活是开撩五湖四海的科技大牛,我会尝试各种姿势,把他们的无边脑洞和温情故事讲给你听。如果你想和我做朋友,不妨加微信(shizhongmax)。

从梅西举杯到世界热泪盈眶,

那一秒钟我们经历了什么?

文 | 史中

世界杯已经过去挺久了。

现在回忆的话,很多人印象最深的画面,可能都只剩下梅西举起大力神杯的那个瞬间了吧。

但我不是,我有一些独特的记忆。

那是2022年11月23日,我住的小区里很多楼都因为出现了病人而封闭了,医疗垃圾装在黄色的袋子里,堆在大白逡巡的楼道口。晚饭后,我看到了告示:“今晚10点开始,小区将只进不出,整体封闭三天 。”

疫情三年来,我运气一直比较好,侥幸躲掉了病毒诸次“绞杀”,这是第一次面对如此风声鹤唳的情况。

心里突然涌上恐惧,我做出一个奇怪的决定:趁现在离开家,10点之后再回来,越晚越好——似乎这样就能逃离眼前的难题。

我在街头漫无目的地闲逛,天黑,风冷,路上没有一个人。我才知道,附近的小区统统做出了封闭三天的决定。我甚至开始把自己代入“僵尸片”的剧情,胡乱琢磨末日求生的事儿了。。。

手机震了一下,抖音的一条推送把我拉回人间,提醒我该看球了。我才想起来,世界杯已经开始好几天了,而作为一个曾经热爱足球的骚年,这届我还一场都没看过。

那天是日本对德国的小组赛。我决定,一边“流浪”一边把这场球看完。

展开全文

街上只有流浪狗狗,和我

手冻得厉害,只好两手“接力”举手机。街灯昏黄,映着手里的绿茵场格外鲜亮。

那一刻我又做了个决定:这一晚对自己好一点,不在乎流量,一狠心把清晰度调到了最高。

抖音问我:这个档位会消耗大量的流量,是否。。。

我说别废话,给我播!

当时的我,并不清楚画面背后究竟对应着什么技术参数,只有一个感觉:真XX清晰。清晰到可以看到草坪上的草尖。

我开始沉浸在球赛里。

看着球员眼神里闪烁的光,看台上翻滚的旗帜,突生感慨,此时此刻仍旧有很多人在热烈而无畏地战斗。如果把镜头拉远,我眼前的万丈沟壑是否也会成为岁月里的轻描淡写呢?

第83分钟,浅野拓磨攻进了反超的一球,日本2:1绝杀逆转。队员们抱在一起,肆意欢庆从强敌嘴里抢来的胜利。

那一刻,万里之外的我,决定转身回家。

回家的路上,我想:要是有朝一日春暖花开,有机会走出家门,我一定得找到抖音的老师傅,问问他们是怎么把转播画面搞得这么清晰的。

没想到,这一天这么快就来了。

(一)直播,就是从一个水桶倒进另一个水桶,再倒进下一个水桶

哪怕是最专业的球迷,看球的时候也只需一个屏幕。

胖虎不一样。他面前排着五个屏幕——电视、电脑、iPad、两部手机。。。

“这。。。你看得过来吗?”我问。

“不能输给别人呀。”他答非所问。

原来,胖虎身上有个“特殊使命”,他是抖音转播世界杯的“画质调优”老师傅(之一)。面前几个屏幕上虽然播放的是同一场球,但“来源”却不同:有抖音的,有CCTV5的,还有几个友商的。

他的目标很简单: 这么多转播画面,抖音的必须是最漂亮的,没有之一。

我惊了,原来我在街头看那场比赛时,岂止是球员在场上玩儿命,在转播画面背后,老师傅们也是玩了命在较劲。。。真是一个“卷”到不行的世界呢。。。

胖虎(我见过最瘦的胖虎)

话说回来,老师傅这么卷也有情可原:

首先,是钱的事儿。2022卡塔尔世界杯,其实是抖音第一次试水转播世界级体育赛事。为了从央视买下转播权,花了老鼻子钱,这要是播出去没人看,那钱不是白花了吗?

更重要的,是脸的事儿。抖音的祖传艺能就是短视频和直播。要是直播小姐姐美美哒,直播足球却很拉胯,被大家吐槽,老师傅的脸往哪儿搁?以后在道儿上怎么混?!

说到这,估计已经有浅友开始纳闷了:

不对啊,大家播放的不都是从卡塔尔传回的现场画面么,怎么还能分出来谁好谁坏呢?

客官有所不知,我举个栗子吧。

浅友们都参加过公司团建吧?有一个经典的游戏是酱的:每队出几个人,手里拿着水桶一字排开,水桶一个比一个小。团队的任务就是,把最大的水桶装满水,然后依次往小的水桶倒,最后一个人把水倒进计分桶。规定时间内,谁把水运输得更快、更多,谁就赢了!

转播的原理,就和这个游戏很神似。

从卡塔尔现场,到你手机上的画面,中间是要经过好几个“水桶”的,粗略来说有以下四步:

1、从真实的世界的“大海”进入现场摄像机的“大桶”。

众所周知,真实世界的光影非常细腻,世界杯哪怕用顶级的设备,都只能记录比赛现场信息的九牛一毛,就像弱水三千,只取一“大桶”饮。

2、从现场的“大桶”传到央视的“中桶”。

为了保证现场画面能第一时间跨越半个地球来到中国,几乎只有一种方法——卫星传输。

可卫星说到底只是天上的一个“铁疙瘩”,身轻体柔干不了重活儿,每秒钟传输信号的能力是有限的,它相当于一个“中桶”。所以,必须把现场画面压缩成卫星能hold住的大小,对于这次世界杯来说,就是 4K 画面。(北京冬奥挑战过8K的极限)

卫星左手接收卡塔尔信号,右手就马不停蹄地转发给央视。

3、从央视的“中桶”到抖音的“中桶”。

央视收到画面后,会兵分两路。一路就是在 CCTV5 或者央视频直接播放,这个暂且不讨论;另一条路就是把信号通过高速网线传给抖音这样的二级转播商。

注意, “二级 ”指的是转播权,不是说画质。具体来说,这里央视会把信号原封传给抖音,就像是接了一根水管,只要水管不抖动,抖音接收到的信号和央视收到的100%相同。

4、从抖音的“中桶”到用户的“中桶”、“小桶”、“脸盆”、“水杯”。

抖音传给用户,就复杂一些。

在看球的时候,咱们的手机屏幕千差万别,网络带宽也有大有小。所以抖音必须得把 4K 画面压缩成不同版本的“水流”,用户有多大桶,抖音就给多大流。

这,就是在看直播时我们可以选择的“4K”、“1080p”、“720p”、“480p”之类的档位。

我们今天的故事,其实都发生在“第四步”里。之所以讲这么多,主要是想让你感受一下全貌:视频信号在传输过程中,并不岁月静好,而是步步惊心。

主要“惊”在两点:

1、几乎每一步都需要“压缩”——只要有压缩,就有画质损失。

2、每两步之间都要有传输——只要有传输,就可能有延时和卡顿。 ‍

1、几乎每一步都需要“压缩”——只要有压缩,就有画质损失。

2、每两步之间都要有传输——只要有传输,就可能有延时和卡顿。 ‍

但反过来说,正是因为转播中不可避免有“画质损失”和“延时卡顿”,才有了这群老师傅施展才艺的舞台啊!

老师傅要做的,就是实力宠粉——施展各种“魔法”,让压缩的画质损失更小,让卡顿和延时更少,让抖音用户喝到的“水”更多、更甜!

那,他们的魔法究竟是啥嘞?

(二)给8000000个像素同时做美容的Tony老湿

我多介绍一句,胖虎所在的团队,其实不是抖音,而是“火山引擎”。

看过中哥之前文章 《你在抖音上点的小红心究竟去哪了》 的浅友应该都了解:抖音是一个产品团队,而它底层最吃劲儿的技术——大数据、云计算、AI——其实都是由字节跳动最野的一群老师傅组团儿搭建的“火山引擎”来支撑的。

换句话说:抖音拉来的客人,火山引擎负责接待。。。

那是2022年8月底的一天,遍布北京、上海、深圳的老师傅突然被火山引擎“视频云”的负责人王悦召唤出来,宣布:咱们抖音拿下了世界杯转播权,大家赶紧准备迎接吧!

看看日历,老师傅们惊呆了:“大哥,这么大的活儿,不能早点说么?眼看只剩两个多月了,我们还啥都没准备呢。。。”

其实,不是王悦不愿意说,他也是刚知道。。。转播权谈判特别复杂,还涉及各种保密条款,只有商务团队敲定合同后,才敢把消息透露给技术团队。

事已至此,多说无益,赶紧带盔披甲,操练起来!!

要我说, 火山引擎各个技术小组的老师傅们,其实也像极了一支球队:转播时,视频画面就像是一颗“球”在他们脚下传递,每个小组都使出自己的魔法“运球”之后,再传给下一位,最终临门一脚,射到用户手里的屏幕上~

咱们不妨一个一个说。

比如胖虎所在的画质团队,他们就像球场上的“中后卫”——是进攻的起点。

他们要做的第一件事儿,是针对世界杯搞一个 “画面增强引擎”。通俗理解,就是给画面 PS 一下。

“从卡塔尔传来的可是 4K 高清画面,已经是很漂亮了,还 PS 个啥?”我问。

胖虎摇头:诶,远远不够。现场画面也不是由一台摄像机拍摄的,质量有好有坏,甚至还有一些镜头是暗光、过曝、对焦不准的。所以我们还要过一遍画质引擎,进行“锐化”、“降噪”和“调色”之类的步骤。

说个冷知识,在抖音有一群神秘的“御用看片员”,他们日常工作就是“刷抖音”。。。

当然不能白刷,得对直播和短视频的画质进行“打分”,根据他们的主观感受,团队再对画质进行优化。

胖虎告诉我, 观众对画面的偏好各不相同,有人喜欢淡雅,有人喜欢浓郁,他们就根据大伙儿的喜好程度做“加权平均”,以满足大部分的偏好。平时你刷抖音看到的直播,都是综合了大家的喜好进行增强的。

可是,抖音的观众看球时,偏好啥样的画面呢?老师傅有点拿不准。

没关系,实践是检验真理的唯一标准。画质团队做出了各种风格倾向的球赛画面,给“看片员”们逐一检阅。打分结果表示——他们喜欢“明亮艳丽的喜庆风格”~

没问题,宠粉儿的老师傅们就这样敲定了画质增强引擎的参数。

世界杯转播的时候,每一帧 4k 画面过来,800万颗像素就会一个不落地经过 Tony 老师(画质增强引擎)的美颜,变成800万个胶原蛋白爆棚的喜气洋洋的妹子(汉子)。

美颜结束,“球”可以传给下一位队友了吗?还不行。

接下来, 胖虎他们面临一个更棘手的任务: 把“HDR 视频”转换成“SDR 视频”。

“啥?啥DR?”我一脸问号。

“来,你看看窗外。” 胖虎说。

顺着他的手指,我看到外面阳光正浓,川流的人车带着各自的阴影,历历在目。

现在在你的视野里,同时存在不同亮度的东西。比如那颗在阳光下的树,可能有几万尼特;而那个人的影子,可能只有几百尼特,如果你直视太阳,它可以达到几十万尼特。

相比真实世界,显示器可就弱鸡了。目前最好的 OLED 手机屏,也只能显示到1000多尼特;而十年前的屏幕更惨,只能显示到100尼特。。。

现在在你的视野里,同时存在不同亮度的东西。比如那颗在阳光下的树,可能有几万尼特;而那个人的影子,可能只有几百尼特,如果你直视太阳,它可以达到几十万尼特。

相比真实世界,显示器可就弱鸡了。目前最好的 OLED 手机屏,也只能显示到1000多尼特;而十年前的屏幕更惨,只能显示到100尼特。。。

他说。

就拿一朵花来说,各个部位的亮度差异也很大。尼特(nit)是标定亮度的单位。

问题来了呀,一个只能显示到100尼特的屏幕,让它播放1000尼特的视频,那臣妾是断然做不到的。(只能拼了老命把超出亮度的像素点全按照100尼特来显示,花白一片。。。)

于是,为了避免尴尬,人们只好给视频定了一些规矩:

SDR,也叫标准动态范围,画面里所有的像素都控制在0-100尼特之间。

SDR,也叫标准动态范围,画面里所有的像素都控制在0-100尼特之间。

HDR,也叫高动态范围,画面里的像素可以在0-10000尼特之间。

HDR,也叫高动态范围,画面里的像素可以在0-10000尼特之间。

遇到普通的屏幕,就给它 SDR 的视频;遇到高级的屏幕(比如 iPhone11以上的屏幕)就给它 HDR 的视频,完美!

这。。。和世界杯转播有啥关系嘞??

刚才说了,抖音从央视接收的信号是 HDR 的。但抖音用户的手机却有各种档次,有的可以显示 HDR 画面,有的只能显示 SDR 画面。

所以抖音必须把推流的档次分成几种:最高等级是 4K+HDR 的;下面的一些档次,例如普通 4K、1080p、720p,就都改成 SDR 格式。

这么一来,不就需要一个把 HDR 转成 SDR 的引擎么?

这个引擎是咋工作的呢?

估计大家都能想到一种最简单粗暴方法:去掉一个0呗。

假设一个 HDR 像素点是1000尼特,转成 SDR 就给它变成100尼特;以此类推,一个 HDR 像素是891尼特,转成 SDR 就变成89尼特。。。

这种操作,有个专业名称,叫做 “色调映射”(Tone Mapping)。

当然啦,真正做色调映射的时候用到的算法曲线会稍稍复杂一点,但总体思路就是酱: 在保证明暗关系大体不变的原则下,把宽幅的亮度区间压到窄幅的亮度区间。

话说这个活儿, 胖虎他们是很轻车熟路的。比如抖音上一些演唱会的直播,也需要把 HDR 画面转成 SDR,或者一些游戏直播,还需要反过来把 SDR 映射成 HDR。

这次搞世界杯, 胖虎他们也没多想,就把之前的色调映射方案拿来继续用呗。但是!很快就有人站出来表示反对。。。

没错,就是“看片员”。

看片员指着屏幕—— 你这个球员,有点黑啊。。。

胖虎说这是黑人球员。看片员说别打岔,白人球员也很黑!

画质团队意识到了问题所在:一幅典型的比赛画面中,往往是天上的大灯最亮,脚下的草坪中等亮,而最最最重要的球员却是偏暗的。

在 HDR 画面里,球员虽相对较暗,但绝对亮度还是有几百尼特的,能看清。可是映射到 SDR 里,本来就暗的球员只剩了几十尼特,“暗得太明显”了。。。

这咋整?办法也有,那就是调整“映射算法”,有针对性地把球员映射得更亮,不就行了吗?

可难就难在要有“针对性”上——必须只把球员变亮,其他的东西不能亮。换句话说,要让算法学会把球员“挑”出来!眼看世界杯开哨在即,留给中国队的时间不多了呀。。。

胖虎他们急出一头汗,把一群看片员拉进小屋里,就做一件事:他手动调整映射算法,看片员盯着画面,说“好”还是“不好”。

这样干了一星期,看片员眼冒金星,老师傅也终于魔改出了一套新映射算法,用 胖虎的话说就是:“手动”+“自适应”。

所谓手动,就是看了大量的足球转播画面后,归纳出了球员的“共性”——一般都在哪个亮度值区间——然后把这个区间的映射值调高。

所谓自适应,就是转播的时候,算法会先计算一下目前这一帧相比“平均值”来说更亮还是更暗,也就是找到它的“个性”,然后再把里面的球员亮度做微调,映射得更精准、自然。

所谓手动,就是看了大量的足球转播画面后,归纳出了球员的“共性”——一般都在哪个亮度值区间——然后把这个区间的映射值调高。

所谓自适应,就是转播的时候,算法会先计算一下目前这一帧相比“平均值”来说更亮还是更暗,也就是找到它的“个性”,然后再把里面的球员亮度做微调,映射得更精准、自然。

就像下面酱:

这么一套魔法下来,效果就是:我们在抖音上虽然看到的虽然是 SDR 画面,但其实,这个画面又不是普通的 SDR,它里面保留了从 HDR 画面里提炼出的“精华”。

你咂么咂么这个味道。

话说画质团队干的事儿还有很多,让 胖虎撒开了讲能说一天,不过我决定先让他暂时休息一下,把“球”传给中场球员——编解码团队的老师傅。

(三)视频压缩,就像是把牛奶变成奶粉

对于凌一来说,这个夏天他的内心可谓像过山车一样“折腾”。

因为,世界杯项目是8月底开始的,可是直到9月底,他还不确定自己所在的“编解码团队”到底是能首发出场还是坐板凳替补。。。

凌一

为了说明这个紧张刺激的局面,中哥得先给你讲讲啥是 “编解码”。

咱们可以打个比方:

1、世界杯的直播画面,就像你网购的一个商品,需要从商家(抖音)手里发货给你。

2、实际上,每一帧画面都会被打包成一个包裹,“快递员”们开足马力,分别运送给全国观众。

3、你的手机不断接收到“包裹”,把它们拆开,连续播放出来,于是你就看到了动态画面。

1、世界杯的直播画面,就像你网购的一个商品,需要从商家(抖音)手里发货给你。

2、实际上,每一帧画面都会被打包成一个包裹,“快递员”们开足马力,分别运送给全国观众。

3、你的手机不断接收到“包裹”,把它们拆开,连续播放出来,于是你就看到了动态画面。

从抖音的服务器,经过快递员运送,到用户的手机。

就拿最高级的 HDR 档位来说,它的分辨率有 4K,而且每秒钟的帧率是50,也就是每秒钟有50张800万像素的图片要传输, 凌一简单给我算了下,接收这么多信息,大概一秒就需要50M的流量。。。

这50M还只是传给一个人,要是同时传给几千万人,先别说要花多少钱,很多省市的网络都会被挤爆。。。

快递员肯定第一个骂骂咧咧退出群聊!

那咋办?

上狠活啊!

打个比方,大家都买过牛奶,牛奶如果从产地原封不动运输过来,当然口感最好;

但直接运输又沉又占地方,其实可以把其中的水分挤出来,做成奶粉,用户再一冲水,不就恢复成奶了么?这味道也八九不离十!

诶,视频也可以这么操作。

把视频从牛奶压成奶粉的过程,就是“压缩”,需要用到编码器;

往奶粉里兑水恢复成牛奶的过程,就是“解压缩”,需要用到解码器。

这么一压缩,原来每秒50M的视频,就一下子变成了10M左右,节约了可不是一点半点啊。

在服务器压缩,快递员把压缩包送给手机,手机再解压缩。

凌一,做的正是这个“编解码器”。(其中,编码器部署在抖音服务器上;解码器,就放在各位手机的抖音App里。)

话说回来,这么重要的技术,板上钉钉应该首发出场啊,怎么还不确定呢?

问题出在“编码器”上。

实际上,编码器分为两种: “软编码器”和 “硬编码器”。

软编码器是用软件做压缩,你可以理解为一群“软”妹子做奶粉,干活儿比较细腻,能尽量保证奶粉的原汁原味,缺点是干活儿的效率比较低,需要很多妹子(计算力)。

硬编码器是用专用芯片做压缩,相当于一个“硬”汉子做奶粉,干活儿糙且暴力,但优点就是干得真快。。。

凌一做的是“软编码”,按理说效果更好,应该是首选。

可是这画面又是 4K,又是 HDR,每秒还有50帧,信息量实在是太大了,初步测试,已经超过抖音现有软编码服务器的能力上限,换句话说:做奶粉(压缩)的速度赶不上产奶(直播)的速度。。。

团队没办法,只能拿出两个预案:以9月底为限,如果软编码团队能把计算量降下来,就用软编码;如果不行,只能换硬编码顶上。

为了捍卫老师傅的荣光,为了中国球迷的福祉,为了世界的和平, 凌一他们决定拼了:

把编码器完全拆开,重新调试其中的每一个零件!

为了让你能看明白老师傅的姿势,这里中哥还得插入一下,解释一下编码器的工作原理。

1、编码器的核心原理很简单:在一个视频里,这一帧画面和下一帧画面总会有很多地方是相同的。所以只要 传送下一帧相对于这一帧的“变量”(残差),不就能补全下一帧的内容了吗?

2、可是难度在于:视频是实时传输的,下一帧的画面具体会在哪里变化,谁都不知道啊。这时候,就需要使用“预测算法”,根据画面之前的运动方向,猜出 下一帧“最可能”哪里变。

3、编码器就像一个工具箱,里面有成百上千的编码小工具。对下一帧内容“猜”得更准,不仅可以 减少编码过程中做的“无用功”,还可以选择更合适的 编码工具组合来压缩,从而减少了总体计算量。

你看到了没,降低编码计算量的第一个难题,就在于“对视频内容的预测”上。

了解了这个,再来看老师傅的“谜之操作”,你就会发出会心微笑了。

凌一他们第一时间找来了英超、欧冠之类的历史视频,把每场比赛都切成了几千段30秒或1分钟的片段,然后分门别类,从中总结出了 几十种视频类型。

例如,有的是全景,有的是球员特写,有的是观众。当然还有技术层面的分类,例如纹理复杂的镜头、内容简单的镜头、对比度高的镜头、噪声大的镜头,等等。

然后,针对每一类镜头,都尝试找到最适合的预测算法:

比如,对于球场远景镜头来说,大概率接下来所有物体都不会发生剧烈运动。

于是,在编码时就可以激进一些↓↓↓

比如,对于一些“带球过人”、“争顶头球”的近景镜头,连球员自己都不知道下一秒要往哪跑,系统就很难预测画面变化,这时就要“扩大向量的搜索范围”,通俗来讲就是让算法提前做好“心理准备”,这一帧出现在左下角的东西,下一帧可能就跑到了镜头中央。

于是,在编码时就得保守一些 ↓↓↓

有了对各类镜头更准确的预测,接下来就是给它们分配最顺手的“编码工具组合”。

可问题来了:这么多编码工具,排列组合的话有成千上万种可能,针对特定的镜头来说,到底那个组合更好,老师傅也不敢乱点鸳鸯谱。

于是 凌一他们采用了一个暴力的方法——先让系统在所有可能性的茫茫大海里自由翱翔, 自动试出一些有显著优势的工具,然后交给老师傅人工判断。

“即便有了机器预选,我们还是迭代了上百次,才找出相对最佳的工具组合。” 凌一回忆。

就这样一个月不休不眠, 凌一做梦都是足球场的绿油油。到了9月底,终于迎来命运宣判的时刻。

但这时, 凌一其实一点儿都不慌了——他们已经把编码的计算量降低了30%还多。更厉害的是,在清晰度没有变化的前提下,不仅编码过程计算量少了,编出的码还小了10%。

这相当于他们做的奶粉,在保证口感的基础上,不仅做得更快,还做得更浓了。

这一下,编码服务器的计算力不仅够用了,甚至还有富裕。。。

凭实力赢得“首发”,大家都服气,挑起大拇哥。编解码的老师傅们笑得像运动会上跑了第一的小朋友,全然忘记了挂在脸上的黑眼圈。

接下来,“球”终于要传到前锋脚下——低延时传输团队。

(四)“我绝不允许抖音用户比别人晚欢呼!”

足球比赛跟电影一样,最怕的是“剧透”。

就拿这次世界杯决赛来说。假设你在手机上看到最关键的点球大赛,还剩最后两个球没踢,悬念正酣时,屏幕顶端突然弹出新闻:“阿根廷点球战胜法国,夺得本届世界杯冠军!”

你是不是有种想杀人的冲动?

没错,造成这个悲剧的原因,就是直播信号有延时嘛。。。

这绝不能接受。

话说8月底,抖音刚拿下世界杯转播权的时候,就拉着火山视频云的负责人王悦开会,提出了一个“极端”要求—— 世界杯转播的平均延时,别超过2秒。

要知道,当时抖音直播的平均延时是3秒左右,一下子就要缩减30%,跨度还是挺大的。

不过王悦蛋定一笑:“没问题,我给你们保底2秒,局部地区、局部场次我争取做到1秒。”

他为啥这么有底气?因为他手里有个刚研究出来的“大杀器”—— “RTM超低延时直播技术”。

钱东明,就是开发这个杀器的老师傅(之一),他给我科普了一下其中的原理:

传统的直播技术,叫“有来言,没去语”。

就是说,服务器只管发送视频流,不了解接收端(手机)的状况——这就像填鸭式教学,老师为了照顾全班平均水平,不敢讲太快。。。

RTM 直播技术,叫“有来言,有去语”。

接收端(手机)每隔一段时间(一般是30-60s)会向服务器反馈一下自己的网络情况,这样服务器就可以“看着办”——这就像互动式教学,老师时不时问问学生的感觉,可以加快教学进度。

这种“双向沟通”的玩法,并不是 钱东明的发明,而是来自谷歌在2010年就开源的网络电话协议 WebRTC(Web Real-Time Communication),当年的YY语音、QQ语音,其实都用的是这个技术。

可问题是,这个 WebRTC 最初是为了连麦用的,不是直播用的,所以设计的时候既不支持高清视频的编解码,也不支持大流量传输。这些都得老师傅自己往上加。。。

2020年时,虽然困难重重,但环顾四周似乎只有这个技术能把延时做到超低,前景太太太诱人了,所以 钱东明就带着一群老师傅跳了坑,钻研基于 WebRTC 的直播技术——RTM。

钱东明

这不,到了2022年,终于有成果了,老师傅们傲娇地掏出 RTM ,能够把直播延时降低到500毫秒~1秒之间。

看到这个数据,隔壁的抖音电商直接馋哭了。这要是用在直播带货上,那边主播说“上链接”,这边观众马上就能抢,“钱景”肯定爆棚啊~

说时迟那时快,抖音电商还没吃螃蟹,世界杯却横刀夺爱,把螃蟹给抢走了。

不过,看到世界杯直播流“4K”“HDR”“10M码率”这些参数以后, 钱东明心里咯噔一下——这么大的流,老夫没试过啊。。。

但牛已经被王悦吹出去了,只能明知山有虎偏向釜山行,抓紧调试。总之一句话:绝不能让抖音观众比别人晚欢呼!!

钱东明他们磨刀霍霍,第一刀就砍向了 “首屏加载时间”。

顾名思义,“首屏加载时间”就是从你点进直播,到第一帧画面出现的那段时间。总刷抖音的浅友大概有感觉,这个时间大概是半秒左右,确切说是400毫秒。

我表示400毫秒已经不慢了。 钱东明摇摇头:“从后台数据来看,首屏加载速度继续缩短,观众留下来继续看的比例还会提高!”

况且,在 RTM 技术的框架下,这个时间确实还能缩短。

话说首屏加载的时间,其实主要“浪费”在建立连接这一步——就是在真正传输画面之前,服务器和手机要商量一下,咱传个什么格式,怎么个节奏传。

传统的直播方式,商量使用的是 TCP 协议,特点是“严谨”。

打个比方,就像是有人敲你家门。你问:“谁呀?”外面说:“我是快递员。”你说:“你是哪个快递呀?”外面说:“我是蜗牛快递的!”你问:“你有啥事儿呀?”外面说:“给你送包裹。”这时,你才开门。

可 RTM 直播,用的是 UDP 协议,特点就是“凶悍”。

还拿刚才的场景打比方,就像是一个人砰砰砰砸你的门,一边砸一边喊:“我是蜗牛快递的,包裹给你放门口了!”你一开门,他早没影了。

你看,这种方式是不是快多了。。。

这个“一句话建立连接”的技术,就叫 miniSDP(迷你会话描述协议)。

搞了 miniSDP 之后,首屏加载时间直接从400毫秒降成了300毫秒。

你还记得蜗牛快递员送来的东西是啥么?是 凌一他们的编解码团队压缩出来的“奶粉”嘛!

收到“奶粉”(压缩数据包),你必须在第一时间把它们加水冲开,恢复成牛奶(画面)。

这里,我要纠正一个前面的错误。之前为了行文顺畅,我说一帧画面会压缩成一个大数据包。其实不是,为了传输方便,实际要压缩成几百个小数据包——你只有把几百个数据包收齐了,才能复原出一帧画面。

可 UDP 协议偏偏是个暴力送货员:它只管送得快,不管顺序对。

有可能你连续收到了上千个包裹,发现组成第二帧、第三帧的包裹都齐了,可偏偏第一帧的包裹还差那么几个,这种情况就很尴尬。因为视频得按顺序播放——第一帧不全的话,哪怕后面的帧再全,你也不能开始播放啊。。。

这样一来,不就又拖延时间了么。。。

为了解决这个问题,传输团队大动干戈,修改了底层代码,在每个包裹上都不厌其烦地盖上“时间戳”,然后研究了一套传输策略,让前面的帧,尤其是第一帧里的包,以最大的概率先传到手机里。

在第一帧播放的那20毫秒的闪电时间内,再争分夺秒地组合第二帧,第三帧。。。

就这样,在每一个微观时间的切片里,系统都在和“死神”赛跑,才能把万里之遥的滚烫画面“怼”在你面前。

讲到这里,事情还没完。搞定传输协议,只是打通了“送奶粉”环节。这么大的画面,这么大的帧率,意味着解码器(冲奶粉)的任务也很重要,它能撑住吗?

钱东明预感不佳。果然,之前的解码模块解不了这么“凶”的码。

单说一点,缓冲区不够大。

这啥意思呢?就是快递员给你送包裹的速度太快,你来不及拆完包,家里就堆满了,送不进来了。。。

老师傅们又赶紧修改解码器,不仅加大了缓冲区,还对解码的流程进行了改造——原来是一个人手动“冲奶粉”,现在变成一排机械臂批量“冲奶粉”。

这样一整套“玩命狂奔”的技术下来,直播延时终于能被卡在了1秒之内。

老师傅能歇歇了吗?不能。

因为。。。你有你的计划,世界另有计划:万一遇到网络卡顿,卡了十秒,那用户继续播放的时候,播放的就是十秒前的画面——老师傅辛辛苦苦苦把延时降到一秒,这一下又退了十秒。

直接从改革开放回到解放前了呀!

不过,“网络卡顿”这么普遍发生的事情,老师傅怎么可能没考虑?

卡顿时,会有一个秘密武器登场,这就是—— 追帧。

所谓追帧,就是如果当前进度慢于直播进度,就会在接下来一段时间里,给你加速播放,让进度追平实时直播。

但这个追帧啊。。。都不仅仅是技术,简直是艺术了。

追得太快,用户就会察觉:咋还给我快放了呢?追得太慢,刚要追上,网又卡了怎么办?

实际上,老师傅搞的一整套追帧算法,细节极其复杂,但总体来说就是:落后得多,就得快点追,落后得少,就慢点追;网不好,逮着机会就快点追,网还行,就可以慢点追。

所以,在你手机背后,其实有一条 “看不见的数据河流”,时而宁静,时而奔狂。

为了保险起见,老师傅还专门做了一整套“弱网模拟器”,让“看片员”在弱网环境下看球,然后给说说“怎么卡”感觉最不难受,“怎么追”感觉最自然。

至此,传输、解码、组帧、追帧全部搞定,老师傅甩开所有防守队员,临门爆射,4K、HDR、高码率的世界杯的画面终于可以映照在亿万人的手机上!

话说搞定这些准备,距离世界杯开幕还有一个月左右,时间绰绰有余嘛!

这时,一位看片员弱弱地举手:老师傅,我还有个问题,不知当讲不当讲。。。

(五)执着的看片员,死都不放弃720和480

你发现没,之前老师傅的所有精力基本都集中在 4K HDR 的画面优化和传输上,这很正常,因为大视频更难搞嘛。

可这位看片员提出的问题,却让老师傅闪了一下腰。

他说:“这个720和480清晰度的时候,草坪看上去好模糊啊。。。”

编解码老师傅 凌一说:“你清晰度低,自然就模糊啊。再说,谁会盯着草看呢?”但看片员仍然不依不饶:“我看过别人家的低清转播,草坪就挺清楚。”

这句话一出,现场一片安静,老师傅心底的火开始燃烧。

可是低清画面,码率就限制在0.5M左右。这意味着一个“跷跷板”:如果草坪要更清晰,就一定得让别的什么东西更不清晰才行。

那究竟该牺牲啥呢?肯定是大家看球的时候,越不关心的部分,越可以不清晰啊。可大家“不关心”的到底是哪儿呢?

老师傅们怒了:今天洒家倒是要搞明白,这个球是怎么看的!

他们搞来了一套“眼球追踪仪”,让一群球迷戴上它去看球,然后实时记录他们的眼球动向——身体是最诚实的嘛。。。

结果吓一跳:专业球迷在看球的时候,还真的会看草坪!具体来说,是看草坪上无球队员的跑动走位。这时要是草坪模糊,确实就会影响观感。

那球迷不看的是哪里呢?是观众席。。。

凌一一拍大腿,对啊!一幅画面里经常有很大一部分是背景观众,这些观众的纹理通常还很复杂,需要大量编码,但这些编码其实没那么重要。

只要发现问题,就离解决问题不远了。

老师傅加班加点,升级了编码算法,把观众身上的码率分了一部分给了草地,一根根小草立刻支棱起来了。

草地刚搞定,看片员又举起小手:草地上的“白线”。

原来,因为低清晰度的画面压缩比较狠,导致画面里很细的线条有可能变成断断续续的虚线。可是,球场边线是很重要的元素,怎么说也不能变成虚线啊。。。

老师傅们紧急商讨对策,又叠加了一个算法——让这种细线在编码的时候牺牲一点清晰度,把省出的 buff 加在连续性上,总算解决了“虚线问题”。

这是抖音处理过的480P的画面。

眼看看片员又举起小手:“这次。。。”

老师傅心都快跳出来了。

看片员喘了一口气:“这次,我们的画质无可挑剔了!”

至此,720和480低清画质的“漏洞”终于被堵住——从千兆光纤的土豪,到蹭邻居网的少年,全都不抛弃不放弃!

看看日历,距离世界杯已经只有两周左右了。

就在2022年11月初,抖音连续直播了三场英超比赛。局外人大概看不出门道,但你肯定已经猜到,刚才提到的所有技术,都在这几场直播里进行了终极演练,确保万无一失。

实际上,不仅演练了最新技术,连新技术如果出现问题后,应该怎么“降级”回旧技术,老师傅也都做了完备的预案。

万事俱备,只等开球!

(六)守卫世界杯

在世界杯开赛前几周,疫情变得严重,防控突然紧张。

经常会出现的局面是:要么早晨很多同学发现小区被封,不能来上班;要么晚上下班发现大楼被封,回不了家。

于是,抖音和火山引擎的老师傅都开始了居家办公模式。但问题是,在世界杯进行的过程中,一些保障动作必须在办公室里操作。也就是说,为了确保世界杯直播万无一失,必须有人住在公司附近的酒店。

王悦还记得,各个团队单身、年轻的同学纷纷举手,主动申请住在旅馆做保障,让有家室的老师傅回去陪家人。

“世界杯期间,火山引擎视频云有几十人留在了公司做保障,抖音那边的同学更多,可能有几百人。”他说。

严阵以待中,北京时间2022年11月21日零点,世界杯终于迎来了第一声哨响。

这是揭幕战的 4K 转播画面。

那天夜里,王悦看到直播画面跳跃在屏幕上的一瞬间,已经忘掉了各种专业词汇,反应就是三个字:“真清晰!”

可是,这种纯纯的快乐只维持了一天。到了第二天,阿根廷对沙特的小组赛,王悦脸上的笑容渐渐消失。。。

由于老师傅们干得太狠,“抖音看世界杯最快最清楚”的消息不胫而走。金杯银杯不如观众的口碑——观赛的人数直线狂飙。。。

之前大家曾经预估,这场同时在线观看的人数顶峰会达到1000万人,可眼看实际的在线峰值人数已经突破了1500万!

王悦嗅到了危险的味道,比赛刚一结束,大半夜赶紧跟各方开会:“这样下去,我们的 CDN 资源可能会吃紧!”

啥是 CDN 呢?

视频画面要发给上亿观众,如果都从抖音的服务器上发出,抖音也扛不住。于是要把视频信号先发给遍布全国的高性能服务器,这些服务器再分发给附近的观众。这个内容分发网络,就叫 CDN(Content Delivery Network)。

火山引擎有自建的 CDN,但是为了鸡蛋不放在一个篮子里,还同时买了一些其他公司的 CDN 服务。

可即便这样,还是买少了。。。现有的 CDN 资源一旦被耗尽,就只能加大压缩牺牲画质了。虽说这是个很理性的预案,但王悦的内心,绝不希望动用这个降级预案。

第二天天一亮,老师傅们就开始逐个给供应商打电话,可是得到的消息却是晴天霹雳:“这段时间,其他人也要转播世界杯,还有很多相关的直播节目,各家都在争抢 CDN,现在已经不是涨价的问题,而是没货。。。”

王悦真心后悔,疫情大家都囤了不少干粮,咋就没多囤点 CDN 呢?

眼看只剩下一种办法——扩容自家的“火山引擎 CDN”。

CDN 有很多类型,短时间内最有希望扩容的,是 PCDN,它的原理是利用小节点的细碎计算力,甚至是大伙儿的手机,来互帮互助。你的画面传给我,我的画面传给你。

但这种 PCDN 非常细碎,扩容时需要很精密的调度系统才能实现,但凡一些节点卡住,就扩不上去。

扩容 PCDN 这条路,并不在预案之内,老师傅也没有试过把 PCDN 扩到这么大的规模。对他们来说,这完全就是一场“加时赛”,必须靠平日的经验和训练才能扛住。

果然,第一次扩容尝试出现了 Bug。

但只要还有时间,CDN 团队的老师傅就没理由放弃——那十几个小时,所有组件的开发团队都被调动起来,连夜接力排查——终于,在下一场比赛临近之前,PCDN 冲破阻碍,扩容了两倍。

这所谓的“下一场比赛”,正是我那天“流浪街头”时看的日本vs德国。

“日本对德国这场比赛的观播数据,打破了抖音直播历史上的平均观看时长、总观看人数、峰值观看人数等等所有记录。”王悦心平气和地说出了这个牛X的事实。

“其实,我也出了一份力。”我举手。

王悦

事实证明,提前准备 CDN 这个决策太对了:

比赛逐渐深入,数据一路狂飙,哪怕是半夜一点开始的淘汰赛,同时在线人数也能维持在1000万以上。

12月18日深夜的决赛,抖音观赛人数更是来了一次“核爆”——同时在线突破了3700万,单场累计人数达到了2.3亿人。

现在回忆的话,我躺在被窝里看决赛时, 胖虎正面对五个屏幕对比画质;球迷王悦正左手为梅老板能不能夺冠捏把汗,右手为自己的CDN能不能顶住捏把汗;在北京、上海、深圳,灯火通明的酒店和办公室里,火山引擎的重保将士也在盯着画面和后台数据。

彼时,我们都是在抖音上看世界杯决赛的那2.3亿分之一。

老师傅扶稳方向盘,不仅没有给“抖音崩了”这种词汇登上热搜以任何机会,还向全国球迷挚诚地奉献了 4K、HDR、50帧的动人画面。

而在这一切背后,是服务器轰鸣,马不停蹄地对每个像素进行增强,是转码引擎分秒必争地打包,是 CDN 烽火驿站般地传送;是亿万用户的手机芯片在各种网络环境里脚不沾地地把数据包对齐时间、组帧、追帧;是亿万光子和电子奔流聚散描绘而成的巨浪,是只属于我们所生活的时代的一场赛博奇观。

有人说,抖音这种国民App做直播,播得好不是理所当然吗?

我之所以把这些背后的故事讲给你,恰是想说明:从来没有一种“好”是理所当然的。

(七)“简单人”的胜利

有关决赛,我还记得另一个画面。阿根廷两球领先胜利在望,却在97秒内被对手追平——如西西弗斯看着快要推到山顶的巨石滚落。

这个无比煎熬的瞬间,我猜爱搞事儿的导播一定会把镜头对准梅西。

果然,画面找到了扶着膝盖的他。那一瞬间,我思维飞转,脑补如果我是他,至少应该装出一副冷峻的表情,以示对命运的蔑视。

可我看到梅西这家伙居然在笑。

这个瞬间如同鬼魅。

但很快我又给出了合理解释——无论是谁,当他已经竭尽所能做完一切,面对命运的审判时,除了微笑又能做什么呢?在他微笑的那一刻,上帝就站在他身边。

我对阿根廷球队并无偏爱,但在梅西和队友举杯的时候,我由衷感到鼓舞。

并且,我也确信无数人可以从中得到各自的鼓舞。至少,它让每个普通人的生命剧本里都多了一个证据:在博弈策略日趋复杂的世界里,坚持简单和纯粹,不仅能够得到内心的安宁,也终能赢得外界的荣誉和奖赏。

这和我见过的大多技术人的哲学别无二致。

在我看来,奉献了这届世界杯完美转播的王悦、 胖虎、 钱东明和 凌一这群老师傅,他们都是那种简单的人。他们喜欢技术,于是就去钻研;挑战横在面前,就奋力迎接;如果被放倒,就爬起来再试;击败对手,就拍拍尘土,继续向前。

对于简单的人来说,最重要的守则只有一条: 走下去,不要停。

因为他们需要穿过漫长的时光,才能迎接属于自己的、微不足道的胜利。

告别老师傅们,我走在冬日的暖阳下,似乎好久没有见到路上有这么多车和人了。我的思绪又飘回几个月前,那个街头空无一人的寒冷夜晚。

是啊,重要的是走下去,不要停。

Beijing, 1980s

延伸阅读:

《你在抖音上点的小红心究竟去哪了》

在我心里

它是一颗糖果

再自我介绍一下吧。我叫 史中,是一个倾心故事的科技记者。 我的日常是和各路大神聊天。如果想和我做朋友, 可以搜索微信:shizhongmax。

哦对了,如果喜欢文章,请别吝惜你的“在看”或“分享”。让有趣的灵魂有机会相遇,会是一件很美好的事情。

Thx with in Beijing

特别声明

本文仅代表作者观点,不代表本站立场,本站仅提供信息存储服务。

分享:

扫一扫在手机阅读、分享本文