国内上制订视频编解码技术的组织有两个,一个是 国际电联(ITU-T),它制订的规范有 H.261H.263H.263+ 等,另一个是 国际标准化组织(ISO) 它制订的规范有 MPEG-1MPEG-2MPEG-4 等。而 H.264 则是由两个组织联结组建的 联结视频组(JVT)独特制订的新数字视频编码标准,所以它既是 ITU-T 的 H.264,又是 ISO/IEC 的 MPEG-4 高级视频编码(Advanced Video Coding,AVC)的第 10 局部。因而,不论是 MPEG-4 AVC、MPEG-4 Part 10,还是 ISO/IEC 14496-10,都是指 H.264

1、简介

H.264,同时也是MPEG-4第十局部,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动静图像专家组(MPEG)联结组成的联结视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器规范。这个规范通常被称之为 H.264/AVC(或者AVC/H.264或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)。

2、H264 编码分层

H.264 被分为 视频编码层(Video Coding Layer, VCL)网络形象层(Network Abstraction Layer, NAL)。前者 VCL 关注编码局部,重点在于编码算法以及在特定硬件平台的实现;而后者 NAL 负责格式化数据以及包封装,以保证数据在各种信道和存储介质上的传输。

视频编码层波及的概念:

  • 视频压缩技术

    • 帧内预测压缩,解决的是空域数据冗余问题。
    • 帧间预测压缩(静止预计与弥补),解决的是时域数据冗徐问题。
    • 整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据而后进行量化。
    • CABAC 压缩。
  • I帧:关键帧,采纳帧内压缩技术。
  • P帧:向前参考帧,在压缩时,只参考后面曾经解决的帧。采纳帧间压缩技术。
  • B帧:双向参考帧,在压缩时,它即参考后面的帧,又参考它前面的帧。采纳帧间压缩技术。
  • GOP:两个I帧之间是一个图像序列;一个图像序列中只有一个I帧。

网络形象层波及的概念:

  • SODB:数据比特串(String Of Data Bits),即 VCL 编码后的最原始的数据(长度不肯定是8的整数,故需补齐)。
  • RBSP:原始数据字节流(Raw Byte Sequence Payload),即在 SODB 的前面增加了 rbsp_trailing_bits(第一个比特为1,接下来是0,直到字节对齐)。
  • Emulation Prevention Bytes:防竞争码(0X03),即在编码时,每遇到间断两个 0x00 字节,就插入一个字节的0x03(如 0x000001 => 0x00000301)。解码时将0x03去掉。也称为脱壳操作。
  • EBSP:扩大字节序列载荷(Extension Byte Sequence Payload),即在 RBSP 的根底上减少了防竞争码(0x03)。
  • NALU:NAL单元(NAL Unit),蕴含NALU头和NALU主体(个别为RBSP)。
  • NALU Start Codes:NALU包开始码,因为NALU中不蕴含大小/长度信息,因而不能间接连贯NALU包来构建码流,因为无奈晓得开始、完结地位。通常应用 0x000001 或 0x00000001 作为开始码,四字节的开始码通常用于 SPS、PPS、IDR等NALU,其余采纳三字节。
// 逻辑关系SODB + rbsp_trailing_bits = RBSPmixin(RBSP, 0x03) = EBSPNALU header + NALU body(RBSP or EBSP) = NALUNALU Start Codes + NALU + NALU Start Codes + NALU + ... = H.264 Bits Stream       // Annex-B

3、视频编码

TODO

4、NAL 单元构造

规定VCL是为了无效的示意视频数据的内容。规定NAL则是为了格式化数据,并以实用于存储介质或在多种通信信道上传输的格局提供头信息。NAL单元中蕴含了所有数据,每个NAL单元都是蕴含整数字节。NAL单元规定一种既实用于分组零碎又实用于比特流零碎的通用格局。用于分组传输和字节流的NAL单元的格局是一样的,不过字节流格局中的每个NAL单元前能够有一个起始码前缀和额定填充字节。

NAL 单元(简称 NALU)蕴含 NAL 头和 NAL 主体,其中 NAL 头占一个字节,构造如下:

+---------------+|0|1|2|3|4|5|6|7|+-+-+-+-+-+-+-+-+|F|NRI|  Type   |+---------------+
  • forbidden_zero_bit:0 禁止位,1bit;
  • nal_ref_idc:2bit,用来批示以后 NALU 的重要性。值越大,越重要,解码器在解码解决不过来时,能够抛弃重要性为0的NALU;
  • Type:指 NALU 的类型,5bit,即范畴为 0~31。

NALU 的类型,次要分为两类:1~5的NALU称为 VCL NALU(即视频编码后的数据),其余的称为 非 VCL NALU(一些配置信息)。NALU的类型码如下:

TYPE形容分层NRI
0Unspecified未指定non-VCL
1Coded slice of a non-IDR picture一个非IDR图像的编码条带VCL
2Coded slice data partition A编码条带宰割数据块AVCL
3Coded slice data partition B编码条带宰割数据块BVCL
4Coded slice data partition C编码条带宰割数据块CVCL
5Coded slice of an IDR pictureIDR图像的编码条带VCL非0
6Supplemental enhancement information (SEI)辅助加强信息non-VCL0
7Sequence parameter set序列参数集non-VCL非0
8Picture parameter set图像参数集non-VCL非0
9Access unit delimiter拜访单元分隔符non-VCL0
10End of sequence序列结尾non-VCL0
11End of stream流结尾non-VCL0
12Filler data填充数据non-VCL0
13Sequence parameter set extension序列参数集扩大non-VCL0
14..18Reserved保留non-VCL0
19Coded slice of an auxiliary coded picture without partitioning未宰割的辅助编码图像的编码条带non-VCL0
20...23Reserved保留non-VCL0
24...31Unspecified未指定non-VCL0

常见的RBSP数据结构类型有 IDR_SLICESPSPPSSEI,它们的 NAL header 罕用取值为 0x650x670x680x06。通过具体的文件举例:

  • 通过 ffmpeg 将本地 mp4 文件的 H264 码流剥离进去:ffmpeg -i xx.mp4 xx.h264;
  • 失去的 xx.h264 即为 RBSP(or EBSP)码流;
  • 黄色局部为 0x00000001 开始码,蓝色局部为 NALU header,0x67 为 SPS 信息,红色局部为 NALU body(其中有两个防竞争码)。

5、H.264 基于 RTP 的传输构造

+----------------------+|      RTP Packet      |+--------+-------------+| Header |   Payload   |+--------+-------------+                ⬇️+----------------------+|      RTP Payload     |+----------------+-----+| Payload Header | ... |+----------------+-----+         ⬇️+-------------------------------+|         Payload  Header       | +-------------------------------+| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |+---+---+---+---+---+---+---+---+| F |    NRI    |     Type      |+-------------------------------+

RTP 是实时传输协定,通过该协定打包 H.264 码流时,定义了三种不同类型的载荷构造。接收者可通过 RTP payload 的第一个字节(payload header)辨认载荷构造,payload header 被格式化为 NALU header,与其构造、各字段含意统一。RTP 打包时应用了 24 ~ 31 的 TYPE 值,定义如下:

TYPERTP载荷中NALU类型载荷构造
0未定义
1~23单个NAL单元包单个NAL单元包
24STAP-A,单个工夫的聚合包聚合包
25STAP-B,单个工夫的聚合包聚合包
26MTAP16,多个工夫的聚合包聚合包
27MTAP32,多个工夫的聚合包聚合包
28FU-A,分片单元分片单元
29FU-B,分片单元分片单元
30~31未定义

三种载荷类型别离为:

5.1、Single NAL Unit Packet

繁多NALU包,即每个 NALU 都会被独立封装成一个 RTP 包。RTP 载荷构造如下:

 0                   1                   2                   3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|F|NRI|  type   |                                               |+-+-+-+-+-+-+-+-+                                               ||                                                               ||               Bytes 2..n of a Single NAL unit                 ||                                                               ||                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                               :...OPTIONAL RTP padding        |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+          RTP payload format for single NAL unit packet

5.2、Aggregation Packets

聚合包。当 H264 码流中有若干 NALU 尺寸特地小,因而须要将多个 NALU 封装到一个 RTP 包中。RTP 的载荷构造如下:

 0                   1                   2                   3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|F|NRI|  type   |                                               |+-+-+-+-+-+-+-+-+                                               ||                                                               ||             one or more aggregation units                     ||                                                               ||                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                               :...OPTIONAL RTP padding        |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+           RTP payload format for aggregation packets

聚合包分为两类:

  • 单工夫聚合包(STAP):即聚合有着雷同 NALU 工夫的 NAL 单元。定义了两类 STAP,一类不包含 DON(STAP-A),在每个 NALU 前有两个字节的 NALU szie;另一类包含 DON(STAP-B),在 STAP-A 的根底上多了两个字节的 DON 字段。举例:

     0                   1                   2                   3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                          RTP Header                           |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|STAP-A NAL HDR |         NALU 1 Size           | NALU 1 HDR    |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                         NALU 1 Data                           |
  • NALU 2 SizeNALU 2 HDR
    NALU 2 Data

    : :
    | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    :...OPTIONAL RTP padding

    1.An example of an RTP packet including an STAP-A and two

    single-time aggregation units

    0 1 2 3

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    RTP Header
    STAP-B NAL HDRDONNALU 1 Size
    NALU 1 SizeNALU 1 HDRNALU 1 Data

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
    : :

  • NALU 2 SizeNALU 2 HDR
    NALU 2 Data

    : :
    | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    :...OPTIONAL RTP padding

    2.An example of an RTP packet including an STAP-B and two

    single-time aggregation units
  • 多工夫聚合包(MTAPs):即聚合有着不同 NALU 工夫的 NAL 单元。该 NALU 的构造为:一个16位的 DONB (decoding order number base)和一个或多个多工夫聚合单元,如图1所示。MTAP 又分为了 MTAP16(图2)和 MTAP24(图三),它们的构造类似,区别是:MTAP16 在 DODN(decoding order number difference)后跟有一个16位的 timestamp offset (TS offset),而 MTAP24 是24位。

     0                   1                   2                   3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+              :  decoding order number base   |               |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               ||                                                               ||                 multi-time aggregation units                  ||                                                               ||                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                               :+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                 图1 MTAPs NALU 的载荷格局 0                   1                   2                   3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+:        NAL unit size          |      DOND     |  TS offset    |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|  TS offset    |                                               |+-+-+-+-+-+-+-+-+              NAL unit                         ||                                                               ||                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                               :+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                图2 MTAP16 的多工夫聚合单元格局 0                   1                   2                   3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+:        NALU unit size         |      DOND     |  TS offset    |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|         TS offset             |                               |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               ||                              NAL unit                         ||                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                               :+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                图4 MTAP24 的多工夫聚合单元格局

5.3、Fragmentation Units (FUs)

分片单元。当 H264 码流中的 NALU 长度超过 MTU 大小限度时,须要进行分片。FUs 分为两类:FU-A(图5) 和 FU-B(图6),区别是 FU-B 携带了 DON 。其中 FU indicator 与 NULU header 的构造统一,type 为 28 或 29;FU header 的形成如图7所示,第一位 S(start)示意是否为开始分片,E(end)示意是否为完结分片,R(reserved)必须为0,5位的 type 示意 NALU 单元的类型。

 0                   1                   2                   3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| FU indicator  |   FU header   |                               |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               ||                                                               ||                         FU payload                            ||                                                               ||                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                               :...OPTIONAL RTP padding        |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                    图5 FU-A 的 RTP 载荷格局                     0                   1                   2                   3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| FU indicator  |   FU header   |               DON             |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-||                                                               ||                         FU payload                            ||                                                               ||                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                               :...OPTIONAL RTP padding        |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                    图6 FU-B 的 RTP 载荷格局+---------------+|0|1|2|3|4|5|6|7|+-+-+-+-+-+-+-+-+|S|E|R|  Type   |+---------------+图7 FU header 构造

参考

  • H.264 百度百科
  • H.264/AVC Video Coding Standard
  • RTP Payload Format for H.264 Video
  • H264视频压缩算法
  • NAL Unit解析
  • H264码流格局解析及RTP打包规定整顿
  • 视频和视频帧:H264编码格局整顿