国内上制订视频编解码技术的组织有两个,一个是
国际电联(ITU-T)
,它制订的规范有H.261
、H.263
、H.263+
等,另一个是国际标准化组织(ISO)
它制订的规范有MPEG-1
、MPEG-2
、MPEG-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 = RBSP
mixin(RBSP, 0x03) = EBSP
NALU header + NALU body(RBSP or EBSP) = NALU
NALU 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 | |
---|---|---|---|---|
0 | Unspecified | 未指定 | non-VCL | |
1 | Coded slice of a non-IDR picture | 一个非 IDR 图像的编码条带 | VCL | |
2 | Coded slice data partition A | 编码条带宰割数据块 A | VCL | |
3 | Coded slice data partition B | 编码条带宰割数据块 B | VCL | |
4 | Coded slice data partition C | 编码条带宰割数据块 C | VCL | |
5 | Coded slice of an IDR picture | IDR 图像的编码条带 | VCL | 非 0 |
6 | Supplemental enhancement information (SEI) | 辅助加强信息 | non-VCL | 0 |
7 | Sequence parameter set | 序列参数集 | non-VCL | 非 0 |
8 | Picture parameter set | 图像参数集 | non-VCL | 非 0 |
9 | Access unit delimiter | 拜访单元分隔符 | non-VCL | 0 |
10 | End of sequence | 序列结尾 | non-VCL | 0 |
11 | End of stream | 流结尾 | non-VCL | 0 |
12 | Filler data | 填充数据 | non-VCL | 0 |
13 | Sequence parameter set extension | 序列参数集扩大 | non-VCL | 0 |
14..18 | Reserved | 保留 | non-VCL | 0 |
19 | Coded slice of an auxiliary coded picture without partitioning | 未宰割的辅助编码图像的编码条带 | non-VCL | 0 |
20…23 | Reserved | 保留 | non-VCL | 0 |
24…31 | Unspecified | 未指定 | non-VCL | 0 |
常见的 RBSP 数据结构类型有 IDR_SLICE
、SPS
、PPS
、SEI
,它们的 NAL header 罕用取值为 0x65
、0x67
、0x68
、0x06
。通过具体的文件举例:
- 通过 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 值,定义如下:
TYPE | RTP 载荷中 NALU 类型 | 载荷构造 |
---|---|---|
0 | 未定义 | |
1~23 | 单个 NAL 单元包 | 单个 NAL 单元包 |
24 | STAP-A,单个工夫的聚合包 | 聚合包 |
25 | STAP-B,单个工夫的聚合包 | 聚合包 |
26 | MTAP16,多个工夫的聚合包 | 聚合包 |
27 | MTAP32,多个工夫的聚合包 | 聚合包 |
28 | FU-A,分片单元 | 分片单元 |
29 | FU-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 Size NALU 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 HDR DON NALU 1 Size NALU 1 Size NALU 1 HDR NALU 1 Data +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
: : -
NALU 2 Size NALU 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 编码格局整顿