视频编码与GOP图像序列

把编程当做弹琴 2023-04-23 15:45:08

视频编码压缩

视频压缩编码的目的

降低视频数据大小,方便存储和传输。

YUV格式的视频编码数据

视频编码是对一张张图像来进行的。我们知道彩色图像的格式是 RGB 的,但RGB 三个颜色是有相关性的。采用YUV格式,利用人对图像的感觉的生理特性,对于亮度信息比较敏感,而对于色度信息不太敏感,所以视频编码是将Y分量和UV分量分开来编码的,并且可以减少UV分量,比如我们之前说的YUV420P。

视频压缩原理

编码的目的是为了压缩,各种视频编码算法都是为了让视频体积变得更小,减少对存储空间和传输带宽的占用。编码的核心是去除冗余信息,通过以下几种冗余来达到压缩视频的目的:

  1. 空间冗余:图像相邻像素之间有较强的相关性,比如一帧图像划分成多个 16x16 的块之后,相邻的块很多时候都有比较明显的相似性。
  2. 时间冗余:视频序列的相邻前后帧图像之间内容相似,比如帧率为 25fps 的视频中前后两帧图像相差只有 40ms,前后两张图像的变化较小,相似性很高。
  3. 视觉冗余:我们的眼睛对某些细节不敏感,对图像中高频信息的敏感度小于低频信息的。可以去除图像中的一些高频信息,人眼看起来跟不去除高频信息差别不大(有损压缩)。
  4. 编码冗余(信息熵冗余):一幅图像中不同像素出现的概率是不同的。对出现次数比较多的像素,用少的位数来编码。对出现次数比较少的像素,用多的位数来编码,能够减少编码的大小。比如哈夫曼编码。

宏块

宏块(Macroblock),是视频编码技术中的一个基本概念。通过将画面分成一个个大小不同的块来来不同位置实行不同的压缩策略。在视频编码中,一个编码图像通常划分成若干宏块组成,一个宏块由一个亮度像素块和附加的两个色度像素块组成。

img

图像帧(I帧、P帧和B帧)
图像帧是组成视频的最小单位。
在H.264 中出现的一些概念从大到小排序依次是:序列、图像、片组、片、NALU、宏块、亚宏块、块、像素。
在H.264协议中图像是个集合概念,其中的I帧、P帧、B帧等实际上都是我们把图像这个概念具体化和细小化了。

I帧

I帧(关键帧或帧内帧)仅由帧内预测的宏块组成。

P帧

P帧代表预测帧,除帧内空域预测以外,它还可以通过时域预测来进行压缩。P帧通过使用已经编码的帧进行运动估计。

B帧

B帧可以参考在其前后出现的帧,B帧中的B代表双向(Bi-Directional)。

img


如图所示,上面是原始图像,下面是预测图像。预测图像的每一帧只需要记录对应原始图像帧中没有出现的部分即可。比如,P帧参考I帧,其只会记录I帧中未出现的紫色的长方形。B帧需要参考在其前后出现的帧来进行解码,也就是就算B帧的位置在P帧之前,它也要等P帧解码完后才能开始解码。因此,B帧会带来编码的延迟。最后,B帧只会记录I帧和P帧中未出现的绿色圆形。

GOP(Group of Pictures)和GOP长度

  • 一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。在视频编码序列中,GOP即Group of picture(图像组),指两个IDR帧之间的距离。

  • GOP长度越大,视频压缩效率越高,但视频质量和视频流恢复能力也越差,反之亦然。

  • 直播,如果是一秒25帧,一般gop设置为25, 50(一般是帧率的倍数)。

  • 如果不是直播流,B帧一般设置2帧连续B帧,以降低码率。

GOP之闭合GOP和开放GOP

闭合GOP和开放GOP常见于视频流中,并影响压缩效率、视频容错能力以及ABR流的切换能力。
闭合GOP以一个被称为IDR(Instantaneous Decoder Refresh, 即时解码刷新)的I帧开始。

  • 顾名思义,闭合GOP对GOP外部的帧是封闭的。一个属于闭合GOP的帧只能参考这个GOP之内的帧。
  • 开放GOP与闭合GOP相反,开放GOP内部的帧可以参考其他GOP中的帧。

img


如上图所示,由I帧开始的即为一个GOP,第一个GOP最后一个B帧参考的后面的帧(即P帧)仍在第一个GOP中,第二个GOP同理。因此,其是一个闭合GOP。

GOP间隔

因为一个GOP通常以I帧开头,所以GOP 越大,编码的 I 帧就会越少。相比而言,P 帧、B 帧的压缩率更高,因此整个视频的编码效率就会越高。但是 GOP 太大,也会导致 IDR 帧距离太大,点播场景时进行视频的seek 操作就会不方便。

img

文章参考于<零声教育>的音视频开发课程:链接https://ke.qq.com/course/3202131?flowToken=1040744

...全文
444 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

528

社区成员

发帖
与我相关
我的任务
社区描述
零声学院,目前拥有上千名C/C++开发者,我们致力将我们的学员组织起来,打造一个开发者学习交流技术的社区圈子。
nginx中间件后端 企业社区
社区管理员
  • Linux技术狂
  • Yttsam
  • 零声教育-晚晚
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

请新加入的VIP学员,先将自己参加活动的【所有文章】,同步至社区:

【内容管理】-【同步至社区-【零声开发者社区】

试试用AI创作助手写篇文章吧