H.264简介
单纯的宏块发送是无序的,h.264编码对宏块进行结构化的处理,它制定了相互传输的格式,将宏块有组织,有结构有顺序的形程一系列码流,这种码流可以通过网络流进行传输,而也可以封装成一个文件来保存。
在H264标准中有一个叫做“Annex-B”的字节流格式,他是H264编码的主要字节流格式。
H.264网络传输
header
起始码0x 00 00 00 01
或者0x 00 00 01
作为分割符
H.264的编码序列包括一系列的NAL单元,每个NAL单元包含一个RBSP(Raw Byte Sequence Payload),其结构如下表:
|NAL header|RBSP|NAL header|RBSP|NAL header|RBSP|
NAL header也会会带有RBSP类型信息:
RBSP类型 | 描述 |
---|---|
PS(参数集) | 存储图像尺寸、视频格式等 (PPS、SPS) |
SEI(增强信息) | 视频序列编码的增强信息 |
PD(图像界定符) | 视频图像的边界 |
编码片 | 片的头信息和数据 |
数据分割 | DP片层数据,用于错误恢复和解码 |
序列结束符 | 表面下一图像为IDR图像 |
流结束符 | 表明该流中已没有图像 |
填充数据 | 哑元数据 |
实际情况如下:
00 00 00 01 06: SEI信息
00 00 00 01 07: SPS (sequence paramter set)
00 00 00 01 08: PPS (picture paramter set)
00 00 00 01 05: IDR Slice (立即刷新)
RBSP
NAL包将其负载数据存储在 RBSP 中,RBSP 是一系列的 SODB(String Of Data Bits)。
帧的概念不同与切片
- 一帧(frame)对应一张图片,而一张图片至少有一个或多个片(slice)
- 片由 NALU 装载并进行网络传输
- 片的主要作用是用作宏块的载体,主要目的是为限制误码的扩散和传输。
片的结构如下表:
SLICE | - | - |
---|---|---|
片头 | 片数据 | - |
片头 | 宏块(Macroblock) | 宏块 |
- 分片头中包含着分片类型、分片中的宏块类型、分片帧的数量、分片属于那个图像以及对应的帧的设置和参数等信息。
- 分片数据中则是宏块,这里就是我们要找的存储像素数据的地方。
NALU头部的类型
enum nal_unit_type_e { NAL_UNKNOWN = 0, // 未使用 NAL_SLICE = 1, // 不分区、非 IDR 图像的片(片的头信息和数据) NAL_SLICE_DPA = 2, // 片分区 A NAL_SLICE_DPB = 3, // 片分区 B NAL_SLICE_DPC = 4, // 片分区 C NAL_SLICE_IDR = 5, / ref_idc != 0 / // IDR 图像中的片 NAL_SEI = 6, / ref_idc == 0 / // 补充增强信息单元 - //参数集是 H.264 标准的一个新概念,是一种通过改进视频码流结构增强错误恢复能力的方法。 NAL_SPS = 7, // 序列参数集 (包括一个图像序列的所有信息,即两个 IDR 图像间的所有图像信息,如图像尺寸、视频格式等) NAL_PPS = 8, // 图像参数集 (包括一个图像的所有分片的所有相关信息, 包括图像类型、序列号等,解码时某些序列号的丢失可用来检验信息包的丢失与否) - NAL_AUD = 9, // 分界符 NAL_FILLER = 12, // 填充(哑元数据,用于填充字节) / ref_idc == 0 for 6,9, 10 (表明下一图像为 IDR 图像),11(表明该流中已没有图像),12 / }; ps: 以上括号()中的为类型描述
- I,P,B 帧 与 pts / dts
I帧 P帧 B帧 帧内编码帧 前向预测编码帧 双向预测编码帧 I帧通常是每个GOP的第一帧,经过适度压缩,作为随机访问的参考点,可看成一个图片经过压缩后的产物 通过充分低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据编码图像,也叫预测帧 既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧 I,P,B帧
- I frame : 自身可以通过视频解压算法解压成一张单独完整的图片
- P frame : 需要参考其前面的一个I frame 或者B frame来生成一张完整图片
- B frame : 既要参考其前一个I frame 或者 P frame以及其后一个P frame来生成一张完整的图片。
DTS,PTS
- PTS :PTS主要用于度量解码后的视频什么时候被显示
- DTS :DTS主要是标识内存中的Bit流什么时候开始送入解码器进行解码
GOP
GOP是画面组,一个GOP是一组连续的画面。
GOP一般有两个数字,如M=3,N=12,M制定I帧与P帧之间的距离,N指定两个I帧之间的距离。那么现在的GOP结构是
I BBP BBP BBP BB I
IDR
一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。
I和IDR帧都使用帧内预测。I帧不用参考任何帧,但是之后的P帧和B帧是有可能参考这个I帧之前的帧的。IDR就不允许这样。
- 核心作用 : H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。
引用链接:https://www.jianshu.com/p/24f2a069dd7e