一、从视频图像角度看:H264->GOP->Frame->Slice->Block
序列 (GOP)图片 (pictrue)片 (Slice)宏块 (Macroblock)子块 (subblock)
GOP(Group of Picture)组成:两个I帧之间的所有帧为一个GOP。1个GOP = 1个I帧 + 若干个B帧 + 若干个P帧
I帧、B帧、P帧
- I 帧 Intra picture 帧内编码帧。 关键帧,帧内压缩。 I 帧通常是每个 GOP(group of pictures) 的第一个帧; 一个 I 帧可以看成是一张图片经过压缩后的产物; I 帧本身可以通过视频解压算法解压成一张单独的完整的图片。
- P 帧 Predicative-frame 向前预测编码帧。 前向预测编码帧,帧间压缩。 P 帧需要参考其前面的1个 I 帧或者 P 帧来生成一张完整的图片。
- B 帧 Bi-directional interpolated prediction frame 双向预测帧。 双向差别帧,帧间压缩。 B 帧需要参考其前1个 I 或者 P 帧及其后的几个 P 帧来完成一张完整的图片。
IDR帧:(Instantaneous Decoding Refresh,即时解码刷新)
IDR帧特殊的I帧。当解码器遇到IDR帧就会清空参考队列,将已解码的数据全部输出或抛弃,开始解码新的序列。而普通的I帧不会清理参考队列,也就是说IDR可以阻断误差的累计,而普通I帧不行。
二、从数据角度看 H264-> 若干个[ StartCode ] + [ NALU Header ] + [ NALU Payload ]循环
H.264 原始码流(裸流)是由⼀个接⼀个 NALU 组成,NALU 的功能分为 2 层:
VCL (视频编码层): 包括核心压缩引擎和块,宏块和片的语法级别定义,设计目标是尽可能地独立于网络进行高效的编码;
NAL (网络提取层): 负责将 VCL 产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别。
原始 NALU 单元 = [ StartCode ] + [ NALU Header ] + [ NALU Payload ]
H264码流是一个个连续的NALU,一个NALU包含 [NALU Header][NALU Payload (RBSP)] 三部分
StartCode:是一个NALU单元开始。主要是为了将相邻两个NALU划分开,让他们有一个界线,方便解码。必须是 0x00 00 00 01 或者0x00 00 01。
NAL header:定义了RBSP(payload)单元的类型。由 1字节(8位)组成。禁止位(1位)、重要性指示位(2位)、NALU类型(5位)
SPS(Sequence Paramter Set,序列参数集)SPS 中保存了一组编码视频序列的全局参数。pps主要包含熵编码类型、基础QP和最大参考帧数量等基本的编码信息
PPS(Picture Paramter Set,图像参数集)对应的是一个序列中某一幅图像或者某几幅图像的参数。sps主要包含图像的宽、高、YUV格式和位深等基本的信息
如果没有pps和sps中包含的基础信息,之后的I帧P帧和B帧就无法进行解码。传输 H264 原始码流(裸流)过程中,在发送 I 帧之前,至少要 先发一次 SPS 和 PPS。
h264常见的帧头数据为:
00 00 00 01 67 (SPS)
00 00 00 01 68 (PPS)
00 00 00 01 65 (IDR帧)
00 00 00 01 61 (非IDR帧)
00 00 00 01 06 (SEI)
NALU Header 常见的取值:0x67 0x68 0x65 0x61,0x47 0x48 0x45 0x41,0x27 0x28 0x25 0x21
NALU header 描述
0x67,0x47,0x27 SPS, 序列参数集,重要级别分别为11、10、01
0x68,0x48,0x28 PPS, 图像参数集,重要级别分别为11、10、01
0x65,0x45,0x25 IDR帧,重要级别分别为 11、10、01
0x61,0x41,0x21 非IDR帧,重要级别分别为 11、10、01
00 00 00 01 06 这是SEI数据,是视频的附加信息,包含了用户的自定义信息,比如时间戳,字幕和弹幕信息等。SEI信息一般放在编码图像之前,很多时候SEI是可以忽略的
00 00 00 01 67 这是SPS数据,这指的是序列参数集,它保存了一组编码视频序列的全局参数。编码视频序列指的是原始数据经过编码后组成的一系列序列集。
00 00 00 01 68 PPS数据,这指的是图像的参数集,主要用于保存图像序列集中一个或多个独立的图像,一般情况下,配合SPS和PPS都是H264开头的两个NALU头。
00 00 00 01 65 IDR数据,IDR指的是H264一帧完整的图像数据,也就是常说的关键帧。
00 00 00 01 61 (非IDR帧),普通I帧、B帧、P帧
所以一个标准的H264码流结构一般是:{SEI+SPS+PPS+IDR+非IDR}循环
winhex打开海思开发板保存的H264文件
标签:编码,00,01,H264,IDR,NALU,解析 From: https://www.cnblogs.com/ordinary-world/p/18512436