欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

H.264小结

程序员文章站 2022-07-06 22:57:19
...

由于毕设做视频直播技术,所以需要学习h.264只是以下内容来自网络

少说话来一发

H.264小结

H.264是干什么的?

首先我们得明白,我们研究h.264为的是什么,其次我们得明白一些基础概念,然后才是具体实施。下来我们说下h.264是做什么的。

h.264具体是压缩视频的,如果不压缩视频,在网络环境中传输可能导致流量耗费特别严重,而且传输过程中容易出错,所以h.264就是针对这些问题产生的。

H.264基本概念

在H264协议里定义了三种帧,
- 完整编码的帧叫I帧,
- 参考之前的I帧生成的只包含差异部分编码的帧叫P帧
- 还有一种参考前后的帧编码的帧叫B帧。

在H264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流,以I帧开始,到下一个I帧结束。一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。

三种帧特点说明

(1) I帧
I帧:帧内编码帧 ,I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)
I帧特点:
1)它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;
2)解码时仅用I帧的数据就可重构完整图像;
3)I帧描述了图像背景和运动主体的详情;
4)I帧不需要参考其他画面而生成;
5)I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
6)I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
7)I帧不需要考虑运动矢量;
8)I帧所占数据的信息量比较大。
(2) P帧
P帧:前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
P帧的预测与重构:P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的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帧的压缩比较高。
(3) B帧
B帧:双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况,但我这样说简单些),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。
B帧的预测与重构
B帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。
B帧特点
1)B帧是由前面的I或P帧和后面的P帧来进行预测的;
2)B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
3)B帧是双向预测编码帧;
4)B帧压缩比最高,因为它只反映两参考帧间运动主体的变化情况,预测比较准确;
5)B帧不是参考帧,不会造成解码错误的扩散。

H.264码流

H264编码格式

在 VCL 数据传输或存储之前,这些编码的 VCL 数据,先被映射或封装进NAL 单元中。每个 NAL 单元包括一个原始字

在原始编码数据的后面填加了结尾比特。一个 bit“1”若干比特“0”,以便字节对齐。
H.264小结

NAL Header

H.264小结

nal_unit_type取值的含义如下:
0 没有定义
1-23 NAL单元,单个 NAL 单元包
1 不分区,非IDR图像的片
2 片分区A
3 片分区B
4 片分区C
5 IDR图像中的片
6 补充增强信息单元(SEI)
7 SPS(Sequence Parameter Set序列参数集,作用于一串连续的视频图像,即视频序列)
8 PPS(Picture Parameter Set图像参数集,作用于视频序列中的一个或多个图像)
9 序列结束
10 序列结束
11 码流结束
12 填充

H264码流结构分层

H.264小结

图4为H264码流分层结构,解释如下。
第一层:比特流。该层有两种格式:附录B格式和RTP格式。
第二层:NAL Unit层。包含了NAL Header和NAL Body信息。
第三层:Slice层。

一帧视频图像可编码成一个或者多个片,每片包含整数个宏块,即每片至少 一个宏块,最多时包含整个图像的宏块。
片的目的:为了限制误码的扩散和传输,使编码片相互间保持独立。片共有 5 种类型: I 片(只包含 I 宏块)、P 片(P 和 I 宏块)、B 片(B 和 I 宏块)、SP 片(用于不同编码流之 间的切换)和 SI 片(特殊类型的编码宏块)。
片的语法结构(如图5所示):片头规定了片的类型、属于哪个图像、有关的参考图像等;片的数据包含了一系列宏块和不编码数据。

第四层:Slice data层。Slice由宏块(macro block, MB)组成。宏块是编码处理的基本单元。
第五层:PCM类。
第六层:残差层。

H264的Level(级别)和Profile(档次)说明

Max macroblocks:最大宏块数。注:宏块尺寸是16x16的。
  per second:每秒(的最大宏块数)。可用于约束帧率。
  per frame:每帧(的最大宏块数)。可用于约束分辨率。
Max video bit rate (kbit/s):最大视频码率。不同档次(Profile)下会有区别。
  BP:Baseline Profile,基线档次。
  XP:Extended Profile,进阶档次。
  MP:Main Profile,主要档次。
  HiP:High Profile,高级档次。
  Hi10P:High 10 Profile,高级10位档次。
  Hi422P:High 4:2:2 Profile,高级4:2:2档次。
  Hi444PP:High 4:4:4 Predictive Profile,高级4:4:4(实验性?)档次。
H.264 主要Profile 说明:
BP(Baseline profile):提供I/P帧,仅支持Progressive(逐行扫描)和CAVLC。多应用于“视频会话”,如可视电话、会议电视、远程教学、视频监控等实时通信领域;

  • XP(Extended profile):提供I/P/B/SP/SI帧,仅支持Progressive和CAVLC。多应用于流媒体领域,如视频点播、基于网络的视频监控等;
  • MP(Main profile):提供I/P/B帧,支持Progressive和Interlaced(隔行扫描),提供CAVLC和CABAC。多应用于数字电视广播、数字视频存储等领域;
  • HiP(High profile):(Fidelity Range Extensions,FRExt)在Main profile基础上新增8*8帧内预测,Custom Quant,Lossless Video Coding,更多YUV格式(4:2:2,4:4:4),像素精度提高到10位或14位。多应用于对高分辨率和高清晰度有特别要求的领域。