H264简介

H264简介(未完待续)

0、提前说明

写这篇文章的时候,准备不足。越写发现自己的知识面越不成体系,总结之,这几年的根基打的不牢。截止写提说明的时候,该博客中体现的主要是一些基础概念和简单的过程,考虑到本文介绍的概念及编码过程仍适合部分初学者阅读,最终决定还是将该文章内容发出来。博哥深知自己功底不足,于是向行业人请教,他们推荐读以下两本书,好让自己重新回炉,若是有相关好的资料和图书 欢迎推荐。
在这里插入图片描述

在这里插入图片描述
这这里送上博哥手写,与大家共勉!
在这里插入图片描述

1、H264简介

H264视频压缩算法是目前所有视频压缩技术中使用最广泛、最流行的一种。这里还是要讲一下,编码的目的是什么?为什么要编码,实际上就是通过编码,为了减少数据量,便于存储和传输。

本篇内容会结合H264编码原理和实际用用分别做介绍。

2、编码简介

说在最前边,若是想详细了解H264的编码过程,一定要阅读H264官方的中文文档。
下边是博哥百度网盘的地址:
链接: https://pan.baidu.com/s/1HRRv-JxhEMYasDq2yulwFg
密码: akog

当然估计一上来就说原理相关,会把大家看的一头雾水,尤其是对以前没有接触过H264的同学更是费解。先上一张图,而后我们根据这张图展开:

在这里插入图片描述
如上所示,YUV是从采集出来的原始数据,对于同一分辨率和同一格式,每帧的数据大小相同,与之对应的是其下边编码后的H264,从该图中可以看出,编码后每帧的数据大小不同,总体的数据量明显降低了很多。为存储和传输都带来了性能上的极大提升。

先从上图中提出几个概念:

  • I/P/B
  • GOP

2.1 H264相关名词

2.1.1 帧类型

I帧(Intra-coded picture) :是不需参考其他图像帧,只利用本帧信息进行编码。
I帧特点:

  1. 它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;
  2. 解码时仅用I帧的数据就可重构完整图像;
  3. I帧描述了图像背景和运动主体的详情;
  4. I帧不需要参考其他画面而生成;
  5. I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
  6. I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
  7. I帧不需要考虑运动矢量;
  8. I帧所占数据的信息量比较大。

P帧(Predictive-codedPicture) :依赖I帧和其前面的P帧,采用运动预测的方式进行帧间预测编码。
P帧特点:

  1. P帧是I帧后面相隔1~2帧的编码帧;
  2. P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);
  3. 解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;
  4. P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;
  5. P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;
  6. 由于P帧是参考帧,它可能造成解码错误的扩散;
  7. 由于是差值传送,P帧的压缩比较高。

B帧(Bidirectionallypredicted picture) :它既需要之前的图像帧(I帧或P帧),也需要后来的图像帧(P帧),采用运动预测的方式进行帧间双向预测编码
B帧特点:

  1. B帧是由前面的I或P帧和后面的P帧来进行预测的;
  2. B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
    3)B帧是双向预测编码帧;
  3. B帧压缩比最高,因为它只反映并参考帧间运动主体的变化情况,预测比较准确;加大B帧的数量可以有效地提高视频数据的压缩比,但是在实时互动的环境下,过多的B帧会引起延时,因为B帧会过分的依赖于前后帧,在网络好的环境下,可以正常的传输帧,这样没有什么问题,但是在网络不好的时候,B帧会等待其他帧到来,会引起延时。
  4. B帧不是参考帧,不会造成解码错误的扩散。

2.1.2 画面组

GOP(Group of picture) :一个序列可以理解成内容差异不太大的图像编码后生成的一串数据流。当运动变化较小时,一个序列可以很长,运动变化好代表内容变化小,可以编入同一个I帧率,若是变化大,则序列应该很短。对于实际的网络摄像机,该数值一般都是定值,若是GOP等于60,帧率30fps,也就是2秒一个I帧。大家可以结合这个来理解。

2.1.3 IDR帧

一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。IDR 图像一定是 I 图像,但I图像不一定是 IDR 图像。一个序列中可以有很多的I图像,I 图像之后的图像可以引用 I 图像之间的图像做运动参考。

2.2 编码过程

H264核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。实际上解决两个问题,一个是空间冗余,另一个是时间冗余。空间冗余即为原始数据中包含很多视频不敏感信息,该部分信息可以减少,这部分技术对应的帧内压缩技术,一般经过帧内压缩后,其大小大致相当于JPG图片大小,I帧使用的就是该算法。时间冗余可以理解为,时间轴上连续的原始数据表示的图像变化很小,每帧原始数据都携带了很多相同信息,可以根据帧间压缩算法将该重复信息去掉,减小数据量,P帧和B帧。

参考csdn博客

2.2.1 编码过程简述

如图所示:

在这里插入图片描述

2.2.2 编码

2.2.2 帧分组及Slice

编码器会根据相关设置,GOP,B帧间隔等来推断I、P、B类型。同样可以根据相关设置推断出Slice类型及大小。
在这里插入图片描述在这里插入图片描述

2.2.3 宏块

H264默认16*16的 宏块。

2.2.4 子块

子块的大小可以是8x16、16x8、4x8、8x4、4x4

3 应用

网络提取层、视频编码层

  • TODO

SPS/PPS

  • TODO

相关参数

  • 码率
  • 帧率
  • 分辨率

H264的传输

  • TODO

英文缩写

entropy code 熵
intra-frame prediction 帧内预测
motion-compensation. 运动补偿
motion-estimation

猜你喜欢

转载自blog.csdn.net/weixin_42955871/article/details/112669255