30

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

 3 years ago
source link: https://blog.csdn.net/agora_cloud/article/details/108211708
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

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

不过视频编码是什么?

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

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

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

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

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

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

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

yy2MRnj.jpg!mobile

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

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

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

由于直接采集到的视频格式太大了,当时的电脑根本无法直接处理。正如我们在视频中举的例子,以一张 1920*1080 的图片为例,要传输这张照片就需要 1920*1080*8*3个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分钟的免费额度,快来试试吧。

bY7J7fz.jpg!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK