音视频基础_7_视频压缩技术简介

视频压缩(编码)技术简介

YUV 数据相比RGB数据,体积会小很多,但是依然太大,进行网络传输之前,必须进行压缩,或者说编码。

视频的压缩技术要比音频和图像更复杂。从数据损失方面来分类,视频压缩和音频,图片一样,也分为无损和有损压缩。此外,根据对图像帧的不同处理方式进行分类,视频压缩分为帧内压缩和帧间压缩。

帧内压缩顾名思义,就是对于每一帧图像本身进行压缩,这点和图片压缩原理是一样的,通过帧内压缩,视频的体积就已经可以大大缩小了。而我们要说的重点是帧间压缩。视频中的图像帧之间是有很多冗余信息的,比如两个人在对话时,画面背景一般是不动的,那么每一帧画面中的背景信息都是冗余信息。帧间压缩就是利用了这个原理,只记录关键的图像帧(关键帧),以及图像之间的变化信息,将冗余信息进行压缩,在解压缩时,再通过关键帧和变化信息,结合预测技术,将所有图像帧进行还原。

可以说,帧内压缩解决的是图像中的空间冗余,而帧间压缩解决的是视频中的空间冗余。很多压缩技术都会同时使用帧内压缩和帧间压缩。常见的视频压缩技术有如下几种:

  • MPEG-2:是 MPEG (又遇到它了)组织制定的视频和音频有损压缩标准之一,多用于 DVD 和数字电视中。
  • H.264:也叫 AVC(Advanced Video Coding),现在最流行的视频压缩技术,是 MPEG-4 标准中视频压缩技术的具体实现,同时使用帧内压缩和帧间压缩,压缩率和效率都很好,是在线视频,直播,视频通话领域使用的最多的视频压缩技术。
  • H.265:H.264 的升级版本,全称为高效视频编码(High Efficiency Video Coding,即HEVC)。原理和 H.264 相似,但是相较于之前的H.264标准有了相当大的改善,仅需原来的一半带宽就可以播放相同质量的视频。H.265 也在慢慢普及开来,但是由于很多场景下 H.264 就够用,所以暂时还未取代 H.264。
  • Prores:苹果推出的编解码技术,视频质量较高,常用于影视剪辑。
  • GoPro CineForm:是专为编辑高分辨率素材而设计的跨平台中间编解码器,编码效率高,编码后的视频质量高,常用于影视剪辑。
  • VP8/VP9:Google 开发的开放格式、无使用授权费的视频压缩标准,VP9 是 VP8 的升级版,也是谷歌浏览器内嵌支持的压缩技术。Youtube 视频就采用 VP9 编码。VP9 和 H.265 或许是将来最流行的两种压缩技术。

H.264 编码原理介绍

H.264 是现在最流行的编解码技术,下面简单介绍下其原理,以及一些基本概念。

H.264 的帧内压缩和图片压缩类似,但是多了一些用于视频方面的技术,例如宏块和子块划分,预测机制,熵编码,环路滤波等等,最终的压缩率也比图片压缩率高得多(能压缩到原始数据的百分之一)。具体原理非常复杂,这里就不多介绍了。

H.264 会将图像压缩为不同类型的帧:I帧,P帧,B帧,具体解释如下:

  • I帧:关键帧,采用帧内压缩技术。可以理解为这一帧画面的完整保留,解码时只需要本帧数据就可以完成。
  • P帧:向前参考帧,在压缩时,只参考前面已经处理的帧。P帧采用帧间压缩技术,没有完整画面数据,只有与前一帧的画面差别的数据。P帧存储的是这一帧跟之前的一个关键帧或P帧的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。
  • B帧:双向参考帧,在压缩时,它即参考前而的帧,又参考它后面的帧。B帧同样采用帧间压缩技术,记录本帧与前后帧的差别(具体比较复杂,有多种情况),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时需要较高的性能。

只看解释还是比较难理解,我们使用 Elecard Streameye Tools(一个H.264分析工具)来打开一个H.264编码文件来具体分析就比较好理解了。如下图所示:
H.264分析
图中红色条表示 I 帧,蓝色条表示 P 帧,绿色条表示 B 帧。可以明显看到三者的数据量差别(纵轴)。先来看 I 帧:
I帧
I帧就是一幅完整的图像,图像中的网格就是编码的基本单元(宏块/子块),颜色变化较小的地方使用大一些网格,颜色复杂的地方网格更密集。I帧包含完整的图像信息,解码时使用I帧数据就可以解出完整图像。

再看 P 帧:
P帧
P帧中除了网格之外,还有一些红色的线,这些红线被称为运动矢量,P帧存储的是这一帧跟之前的一个I帧或P帧的差别,依靠的就是这些运动矢量,在解码时,参考前一帧以及存储的差别,来还原一帧画面。

再看 B 帧:
B帧
其实 B 帧原理和P帧差不多,只是需要双向预测,所以有两种运动矢量。

再谈比特率(码率)

在讲音频压缩时,我们就提到过比特率(bitrate,码率),视频中的码率指的是视频每秒钟播放或传输的数据量,单位为 bit/s 或 bps。对于 1080P,YUV 4:2:0,每秒24帧的原始视频,其码率为:1920 * 1080 * (8 + 2 +2)* 24 = ‭579,502,080‬ bps = 565920 Kbps,这种视频显然是无法在线播放的,这也就是视频压缩技术要解决的问题。

对于音频来说,MP3,WMA 格式的在线音乐,码率一般为 128Kbps,音质就很好了。但是对于视频来说,却不能一概而论,因为视频分辨率不同,码率肯定不同,视频分辨率越大,相对来说对码率的要求越高。

以 H.264 压缩为例,推荐的码率如下(数据来源 http://www.lighterra.com/papers/videoencodingh264/):

Name Resolution Bitrate (Mbps) Video (kbps) Audio (kbps)
360p 640x360 0.96 896 64
480p 848x480 1.28 1216 64
720p 1280x720 2.56 2496 64
720p HQ 1280x720 3.20 3072 128
1080p 1920x1080 5.12 4992 128
1080p HQ 1920x1080 7.68 7552 128

注:视频文件一般都包含音频,故列出了音频比特率。

以 1080p 为例,我们计算一下,5.12Mbps = 5242Kbps,是YUV原始视频比特率的百分之一。换算成 Byte,约为 0.64MByte 每秒,这一秒中的数据量里包含了I,P,B帧,其中 I帧占大多数。

H.264 编码的码率是可调的,降低码率,则视频大小会缩小,视频质量会下降(每帧图片被压缩的更严重),反之亦然。

固定码率和可变码率

固定码率(CBR)顾名思义,整个视频码率是固定的,即每秒的数据量恒定,很显然,这种码率计算方法最简单。但是,很多视频中的图像细节丰富程度是随时间变化的,两个人对话时,画面基本上没什么变化,两个人打斗时,画面变化大,单位时间内的数据肯定更加复杂。此时如果使用固定码率,则有时码率会浪费,有时码率不够用,细节丢失,所以H.264 也支持可变码率(VBR),即码率按需分配,简单的场景码率低,复杂的场景码率高。

听上去 VBR 很美好,但是 VBR 对计算机性能要求更高,找出哪些场景简单,哪些场景复杂,本身就需要很大的计算量。不同码率模式有不同的作用,例如直播时一般选择 CBR,因为直播是录制的同时就要编码,进行网络传输,很难计算出场景的复杂度变化,但是如果是已有的视频素材进行压缩,则使用 VBR就更合适。

除此之外还有固定质量码率(CRF),可以让观感画质保持在一定的水准,也经常使用。

当然,说一个视频的码率,一般指的是平均码率,例如 bilibili 上传视频的要求:
bilibili上传视频要求
第一行指的就是平均码率,第二行指的则是可变码率下的最高码率。

GOP

GOP:Group of Picture,每一组 I,P,B 帧被称为一组,GOP 的值就表示这一组总共多少帧,也就是说一个 I 帧之后要经过多少帧才会出现下一帧。

GOP值和视频质量有一定的关系 ,GOP 值越小,说明 I 帧越多,由於单个 I帧的数据量比较大,码率一定的情况下,如果 I 帧太多,每个 I 帧分到的数据量就要减少,则画面质量就会下降。发过来,GOP 值越大,说明 P,B帧越多,每个 I 帧的画面就能越精细,但是 P,B帧数据要计算才能得出,对计算机性能要求比较高,且 P,B帧的质量会受 I 帧影响,所以GOP值也不宜设置过大。另外在遇到场景切换的情况时,H.264编码器会自动强制插入一个I帧,此时实际的GOP值被缩短了。

视频封装格式

视频拍摄的同时也会录制音频,所以数字视频一般都会包含数字音频。其实视频中的画面数据和音频数据是互相独立的,但是最终会被封装进同一个文件中,要将音频和视频封装在一起,就需要使用封装技术。使用某种封装技术的视频一般称为某种格式的视频,这和音乐格式类似。视频封装格式也被称为容器。

常用的封装格式:

  • MP4:有 MPEG (又是他)组织制定的标准,最流行的视频封装格式。其实 MP4 标准非常庞大,甚至 H.264 压缩和 MP4 封装格式都是其中的一部分,只不过简称 MP4。
  • AVI:微软于1992年11月推出的,作为其Windows视频软件一部分的一种多媒体容器格式,也比较流行。
  • MKV:是一种开放标准的自由的封装格式,能够在一个文件中容纳无限数量的视频、音频、图片或字幕轨道,几乎成为了万能的媒体容器,现在也越来越流行。
  • FLV:Flash Video 简称,由于FLV文件体积小巧,CPU占有率低、视频质量良好,这些年在网络上盛行,大多在线视频网站均采用FLV格式文件提供视频。
  • RMVB:曾经最流行的封装格式,DVD 中用的比较多,前些年网上各种盗版电影用的都是它。

视频转码

其实视频转码本质上是一个先解码,再编码的过程。但是我们已经知道了,视频编码和视频封装是两回事,不同的封装格式,其内部可能使用的是同样的编码技术。比如将 FLV 视频转为 MP4视频,如果内部都是 H.264 编码,根本不需要解码,直接换一下封装格式信息就行了。但是如果要把 Youtube 下载的视频转为 MP4,那就得解码再编码了,因为 Youtube 视频用的是 VP9编码,MP4不支持。

推荐一个转码工具 MediaCoder

视频播放器原理

首先介绍一个非常好用的播放器:PotPlayer,无广告,不流氓,功能强大。

我们经常使用播放器,播放器播放的是封装格式,一般的原理如下:
视频播放器原理
其实这张图中的术语我们都讲过了,结合之前的文章,应该不难理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章