H264基本原理

引子 - 为什么要视频压缩

一张为720x480的图像,用YUV420P的格式来表示, 其大小为: 720 * 480 * 1.5 约等于0.5MB。 如果是25帧, 10分钟的数据量 0.5M * 10 * 60 * 25 = 7500MB 7GB多, 视频编码压缩的目的是降低视频数据大小,方便存储和传输。

I、 P、 B帧

在 H264 协议中定义了三类帧

  • I 帧:自带全部信息的独立帧,无需参考其它图像便可独立进行解码。采用帧内压缩技术。I帧是最完整的画面,所以I帧的压缩率不高,占用的空间最大,解码最快。
  • P 帧:向前参考帧,在压缩时,需要参考前面的I帧或P帧才能进行编码。P帧需要依赖前面的帧,所以P帧压缩率比较高,占用的空间较小,解码较慢。
  • B 帧:双向参考帧,采用帧间压缩技术。B帧需要同时参考前面的帧和后面的帧(I帧或P帧),所以B帧的压缩率它的压缩率最高,占用空间最小,但解码较慢,会有延迟。

简单来说就是,I帧可以立即解析,P帧需要参考前面的帧进行解析,而B帧则必须参考前面的帧和后面的帧才能解析出来。

下面简单介绍IBP帧播放时的情况,参考下图:

在这里插入图片描述

解码顺序是指在解码处理时的顺序,例如当遇到一个B帧时,此时不能马上解码,需要先解码后面的P帧,此时的B帧才可以根据前后两个帧进行解码。而这个P帧是根据前面的I帧进行解码的。而显示顺序是指,在解码后,按照原来组织的图像顺序进行显示。

而B帧在等待解码的过程就会造成短时间的延迟,所以在直播场景下一般都会避免使用B帧。

GOP图像序列

GOP(Group of picture)是指一组由一组图像组成的序列,可以简单理解为就是一组连续的图像,参考下图理解:

在这里插入图片描述

在 H.264 中,图像以GOP序列为单位进行组织。

而一组GOP中的第一个图像叫做 IDR 图像(立即刷新图像), IDR 图像都是 I 帧图像。一般来说,一组GOP中只有一个I帧。而GOP的长度越大,视频压缩效率越高,但视频质量和视频流恢复能力也越差,反之亦然。

在这里插入图片描述

其中,GOP有两种:

  • Closed GOP:对GOP外部的帧是封闭的。一个属于Closed GOP的帧只能参考这个GOP之内的帧。

  • Open GOP:与Closed GOP相反, Open GOP内部的帧可以参考其他GOP中的帧。

一般来说,一个视频中的GOP基本上都是Closed GOP,这种Closed GOP的好处是当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR 图像之后的图像永远不会使用IDR之前的图像的数据来解码。

H264编码介绍

编码就是为了压缩,而视频压缩一般就是根据冗余信息去做压缩的,一般来说,视频里面的冗余信息包括:空间冗余、时间冗余、视觉冗余、编码冗余。

在这里插入图片描述

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

对于具体是如何编码的这里就不再过多介绍了,详情可以参考:H264编码原理【转载】

其它

为什么视频格式一般为YUV

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

H264 画质级别

H.264有四种画质级别,分别是baseline, extended, main, high:

  1. Baseline Profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;
  2. Extended profile:进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC;(用的少)
  3. Main profile:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced),也支持CAVLC 和CABAC 的支持;
  4. High profile:高级画质。在main Profile 的基础上增加了8x8内部预测、自定义量化、 无损视频编码和更多的YUV 格式;

H.264 Baseline profile、Extended profile和Main profile都是针对8位样本数据、4:2:0格式(YUV)的视频序列。在相同配置情况下,High profile(HP)可以比Main profile(MP)降低10%的码率。
根据应用领域的不同,Baseline profile多应用于实时通信领域,Main profile多应用于流媒体领域,High profile则多应用于广电和存储领域。

在这里插入图片描述

小点补充

  • pps有qp相关的字段,所以在直播场景中是可以动态设置码率。
  • 播放器会用到seek操作,在每次seek时需要清空解码器。
  • 我们在视频seek时,有时会有短暂的延迟,一般就是B帧在加载。

参考资料

  1. 视频编码原理
  2. H264 基础原理介绍
  3. H264编码原理(帧内压缩技术)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值