视频压缩
若是视频未压缩,一个时长接近两个小时,分辨率为4k的视频,其大小会超过400GB。所以视频的压缩是尤为重要的。
颜色空间
YUV色彩空间不同于RGB,是另一种颜色数字化的表达方式,由于RGB不利于压缩,所以在视频系统中多会采用的是YUV。YUV体系中,不同于RGB的是,其有一个亮度的概念,其中Y表示色度,U和V表示亮度。由于人对亮度的敏感程度要大于色度,所以我们可以通过着重于提升亮度,减低色度,从而达到不降低分辨率的同时压缩视频的效果。
YUV 其实目前有 三种分类:
1,YIQ 适用于NTSC彩色电视制式
2,YUV 适用于PAL和SECAM彩色电视制式
3,YCrCb 适用于计算机用的显示器
我们做互联网音视频开发, 一般说的 YUV 是 指 YCbCr ,U 就是 Cb,V 就是 Cr。
大家经常在一些音视频书籍看到 YCbCr ,把它当成是 YUV 就行。实际上 YCbCr 才是比较准确的术语,JPEG、MPEG 标准 用的也是 YCbCr
上图的第一张是原图,下面的三张分别是 Y Cb Cr。这张图是并未降低色度进行降采样的,事实上我们把色度降采样后拼起来的原图效果是一样的。
对色度降采样
YUV采样格式的压缩
帧内压缩
帧内(Intraframe)压缩也称为空间压缩(Spatial compression)。
当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,达不到很高的压缩比。
如上图,将图片分为多个小方块,对于色值相同的小方块,我们只需要记录一个小方块的数据,其他的就引用该方块的数据即可。
帧间压缩
帧间压缩(Interframe compression)也称为时间压缩(Temporal_compression),是基于许多视频或动画的
连续前后两帧具有很大的相关性(即连续的视频其相邻帧之间具有冗余信息)的特点来实现的。
通过比较时间轴上不同帧之间的数据实施压缩,进一步提高压缩比.一般是无损压缩。
=>对于画面中静态的不去记录处理它,只去记录变化的画面,称之为记录残差。在呈现的时候,叠加残差值即可获得后面的帧的画面了。
帧的编码类型
I-frame:Intra-frame 帧内帧 (不会依赖其他帧,靠自己就能绘制出完整的画面,压缩比小)
P-frame:Predicted Frame 前向预测帧 (依赖前面的帧,叠加残差值绘制出画面,压缩比较高)
B-frame:Bi-Directional frame (双向预测帧,参考前后的帧)
由于B帧可以参考和插入在它之前和之后发生的两个(或更多)帧(在时间维度上),所以它可以显著降低帧的大小,同时保持视频质量。B帧能够利用空间冗余和时间冗余(未来的帧和过去的帧),这使得它在视频压缩中非常有用。
上图中的第一行数字是帧展示的顺序,第二行数字是帧的解码顺序。上图我们就可以看到,先解码I帧后,就去解码了第四个位置的p帧,然后中间的P帧就依赖这两个前后帧来进行解码。(解码顺序:I->P->B)
对比表格
当拖动进度条,视频改变播放进度后,如果不在同一个 GOP 中,需要从新位置所在的 GOP 的 I 帧开始解码(一定是从I帧开始解码的)
拖动后起播所需的耗时取决于位置在 GOP 中的位置,越靠前能越快响应
不同场景对 GOP 的设置
视频点播:节省带宽,高压缩率,会使用 B 帧
直播:低延迟,不使用 B 帧
视频编辑:提高响应,个别会使用全 I 帧
视频编码格式
现下的编码格式(后者压缩比都比前者提高一倍)有:
- H265 压缩比更高,需要更多的算力
- H264 : AVC 更普及
- H265 : HEVC 更小体积