RTC 科普视频 | 3 分钟了解什么是视频编码

从只能坐在放映机旁、电影院里、电视机前看视频,到可以坐在电脑屏幕前看直播,再到拿着手机、Pad,跟人聊天。

大家与影像、视频交互的方式发生了翻天覆地的变化。

为了让大家能在各种设备上看到清晰的视频,背后的编解码技术也经历了多次演进。

不过视频编码是什么?

本期 RTC 科普,带你了解视频编码的原理。

在胶片时代,人们通过感光成像原理,把人眼看到的景色映照到了胶片上,这相当于我们现在所说的编码过程。

然后人们在通过放映机把胶片投影到幕布上,这就相当于我们现在的解码过程。

但胶片只能在电影院中看到,人们希望在家里也能看到电影。

后来,在 1951 年,脉冲调制编码与第一部数字电视和广播出现了。画面上的每一个像素都是一个数值,这个数值通过一个脉冲信号进行传输。

视频画面以广播的形式传到了千家万户的电视中,电视再基于同样的编解码标准,把视频播放出来。人们终于可以坐在沙发上看电影了。

尽管计算机的出现比电视早了 5 年,但直到 1957 年,计算机技术先驱 Russell Kirsch 通过扫描照片的形式成功地在计算机上显示出了自己 3 个月大的儿子,至此计算机上才真正出现了第一幅图像。

image
图:Russell Kirsch 的儿子(图片源自wafflesatnoon)

如果 Russell 的儿子现在还活着,应该也已经是个老爷爷了。

既然图像都能显示了,那么视频呢?

由于直接采集到的视频格式太大了,当时的电脑根本无法直接处理。正如我们在视频中举的例子,以一张 19201080 的图片为例,要传输这张照片就需要 1920108083个bit,即 47Mb。 其中 3 代表的是 RGB(Red、Green、Blue) 。如果现在要传输一个每秒30帧的视频,每一帧都是这样的图片,那么一秒就需要传输 1.4Gb 的数据,你所需要的带宽就是1.4Gbps。普通家庭很难能有这样的带宽。 很多人可能还在看 720P 的视频。

所以视频需要经过压缩、编码才能传输。这个过程就是视频编码。

不过,由于输入到视频编码器的视频数据必须是 YUV 格式的。因为只有使用 YUV 格式才能极大地去除冗余信息,最大限度地节省网络带宽。

所以,如果目前你手上的视频数据是 RGB 格式的,就需要通过算法将 RGB 转换为 YUV 格式。

准备好输入的 YUV 数据后,视频就该进入编码器了。我们在这里以主流的 H.264 为例。H.264 的视频编码分为五个模块,帧类型分析、帧内/帧间预测、变换+量化、滤波、熵编码。

首先,YUV 格式的视频数据会先经过帧类型分析模块,确定当前这一帧是属于什么类型。

一般来讲,视频帧会分为 I、P、B 三种帧。

你可以把 I 帧理解为电影中的一段连续影像,里面包含了所有的图像信息,只要影像里的画面没有出现太多变化,基本不会出现新的 I 帧(除了超过GOP长度)。

如果在视频中,画面只是出现一些比较小的变化,那么这些变化的信息都会在 P、B 帧中体现出来。

理想情况下,一个视频流,从一个I帧开始后面轻微运动都是 P、B,直到遇到场景切换就再插一个 I,如此往复。一般来说,P/B 参考范围不会越过I帧。但也有特例,我们可以强行指定 P、B 参考不允许越过 I 帧,这样的I帧我们叫它 IDR(Instantaneous Decoding Refresh) 帧,每个 IDR 帧的间隔我们称作一个 GOP。

而实际上,在编码器中实现帧类型分析,通常会先将 YUV 一帧的数据做降采样处理,然后用降采样后的数据先进行帧内/帧间预测,估算出最能节省码流的方式,来确定当前帧的帧类型。

除此之外,也会有专门判断场景切换阈值的算法,或者固定 GOP 大小下每个 GOP 的开始强行指定 IDR、每个 GOP 结尾强行指定 P 帧的操作。

判断出视频帧类型后,这些帧会再经过帧内与帧间预测 ,以及变换、量化,进一步得到压缩。

由于这几步的处理,可能会出现块效应,比如马赛克就是块效应的一种表现。块效应会影响我们的观看感受,为了避免这种情况,优化视频质量,这些数据还会通过滤波模块。

经过了压缩、优化等处理,这些数据已经可以被传输出去了。

由于我们在真实网络传输的过程中肯定都是二进制码,所以我们需要将当前的像素值进一步压缩成二进制流。在编码中一共有两种熵编码方式:较为简单的 Cavlc,以及一种压缩率更高但运算更复杂的 Cabac。如果你感兴趣,可以详细查查这两算法。

最终编码器会输出这些适合传输的二进制码流,进入网络传输。

当这些数据传输到你的手机上时,解码器会通过熵解码、反量化、反变换等一系列操作,把图像重建出来。这时候你就看到了对方的视频画面。

如何让视频编码又快又好,这是一个难题。声网 Agora SDK 的视频编码器,让视频在拥有高清晰度的同时,还可一定程度上节省码率。用户就能获得身临其境、顺滑的视频体验。下载声网 Agora 的SDK,简单调用API,你就可以在自己的应用中获得超凡的视频通话功能。每月还有10000分钟的免费额度,快来试试吧。