SkeyeARS 视频编码之H.264结构详解

2023-04-03 09:44:39 浏览数 (2)

1、关于 H.264

H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。

这个标准通常被称之为H.264/AVC。

2、H.264 原始码流(即裸流)结构

H264功能分为两层,VCL(视频编码层)和 NAL(网络提取层).

VCL:包括核心压缩引擎和块,宏块和片的语法级别定义,设计目标是尽可能地独立于网络进行高效的编码。

NAL:负责将VCL产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别。

VCL数据传输或者存储之前,会被映射到一个 NALU 中,H264 数据包含一个个 NALU。如下图

一个原始的 NALU 单元结构如下:

StartCode NALU Header NALU Payload 三部分。

StartCode,是一个NALU单元开始,必须是00 00 00 01 或者00 00 01。

其中 NAL Header 格式如下:

代码语言:txt复制
     0 1 2 3 4 5 6 7 
     - - - - - - - - 
    |F|NRI|  TYPE   |  
     - - - - - - - - 
  • F(1 bit):Forbidden_zero_bit,禁止位,编码中默认为 0,当网络识别此单元中存在比特错误时,可将其设为 1,以便接收方丢掉该单元。主要用于适应不同种类的网络环境(比如有线无线相结合的环境)。例如对于从无线到有线的网关,一边是无线的非 IP 环境,一边是有线网络的无比特错误的环境。假设一个 NAL 单元达到无线那边时,校验和检测失败,网关可以选择从 NAL 流中去掉这个 NAL 单元,也可以把已知被破坏的 NAL 单元传给接收端。在这种情况下,智能的解码器将尝试重构这个 NAL 单元(已知它可能包含比特错误)。而非智能的解码器将简单的抛弃这个 NAL 单元。
  • NRI(2 bits):Nal_ref_idc,重要性指示位,用于在重构过程中标记一个 NAL 单元的重要性,值越大,越重要。值为 0 表示这个 NAL 单元没有用于预测,因此可被解码器抛弃而不会有错误扩散;值高于 0 表示此 NAL 单元要用于无漂移重构,且值越高,对此 NAL 单元丢失的影响越大。例如,若当前 NAL 属于参考帧的片,或是序列参数集,或是图像参数集这些重要的单位时,该值必须大于 0.
  • TYPE(5 bits): Nalu_type:表示当前 NAL 单元的类型,类型 1-12 是 H.264 定义的,类型 24-31 是用于 H.264 以外的,RTMP 符合规范使用这其中的一些值来定义包聚合和分裂,其他值为 H.264 保留。

nalu_type

表示NALU 类型

0

未指定。

1

未使用Data Partitioning、非IDR图像的Slice。

2

使用Data Partitioning、且为Slice A。

3

使用Data Partitioning、且为Slice B。

4

使用Data Partitioning、且为Slice c。

5

IDR图像中的Slice。

6

补充增强信息单元(SEI)。

7

序列参数集(Sequence Parameter Set, SPS)。

8

图像参数集(Picture Parameter Set, PPS)。

9

分界符。

10

序列结束。

11

码流结束。

12

填充。

13~23

保留。

24~31

未使用。

因此,如果要知道 nalu 的类型,只需要判断 nalu_type 即可:

代码语言:txt复制
 1 00 00 00 01 06: SEI

 2 00 00 00 01 67: 0x67 & 0x1f = 0x07 : SPS

 3 00 00 00 01 68: 0x68 & 0x1f = 0x08 : PPS

 4 00 00 00 01 65: 0x65 & 0x1f = 0x05 : IDR Slice
  • EBSP:扩展字节序列载荷,在 RBSP 基础上填加了仿校验字节(0x03),它的原因是:在 NALU 加到 Annexb 上时,需要添加每组 NALU 之前的开始码 StartCodePrefix,如果该 NALU 对应的 slice 为一帧的开始(即为 IDR 帧)则用 4 位字节表示:0x00000001,否则用 3 位字节表示:0x000001。为了使 NALU 主体中不包括与开始码相冲突的,在编码时,每遇到两个字节连续为 0,就插入一个字节的 0x03。解码时将 0x03 去掉。也称为 "脱壳操作"。
  • RBSP:原始字节序列载荷,在 SODB 的后面填加了结尾比特(RBSP trailing bits,一个 bit "1")若干比特 "0",以便字节对齐。
  • SODB:数据比特串,最原始的编码数据。

至此,到了 SODB,就是h264最原始的编码数据。

关于SkeyeARS

SkeyeARS全景AR增强监视系统, 是视开科技开发的一款基于宽场景多路视频无缝拼接、视频实时增强、监视目标增强显示、目标自动跟踪、视频存储回放、远程数据传输和多通道全景视频同步显示等功能的综合视频AR增强监视系统,广泛应用于智慧交通、智慧城市、智慧机场等大场景智能监控领域。

1 人点赞