视频压缩(编码)技术简介
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编码文件来具体分析就比较好理解了。如下图所示:
图中红色条表示 I 帧,蓝色条表示 P 帧,绿色条表示 B 帧。可以明显看到三者的数据量差别(纵轴)。先来看 I 帧:
I帧就是一幅完整的图像,图像中的网格就是编码的基本单元(宏块/子块),颜色变化较小的地方使用大一些网格,颜色复杂的地方网格更密集。I帧包含完整的图像信息,解码时使用I帧数据就可以解出完整图像。
再看 P 帧:
P帧中除了网格之外,还有一些红色的线,这些红线被称为运动矢量,P帧存储的是这一帧跟之前的一个I帧或P帧的差别,依靠的就是这些运动矢量,在解码时,参考前一帧以及存储的差别,来还原一帧画面。
再看 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 上传视频的要求:
第一行指的就是平均码率,第二行指的则是可变码率下的最高码率。
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,无广告,不流氓,功能强大。
我们经常使用播放器,播放器播放的是封装格式,一般的原理如下:
其实这张图中的术语我们都讲过了,结合之前的文章,应该不难理解。