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 类型 |
---|---|
| 未指定。 |
| 未使用Data Partitioning、非IDR图像的Slice。 |
| 使用Data Partitioning、且为Slice A。 |
| 使用Data Partitioning、且为Slice B。 |
| 使用Data Partitioning、且为Slice c。 |
| IDR图像中的Slice。 |
| 补充增强信息单元(SEI)。 |
| 序列参数集(Sequence Parameter Set, SPS)。 |
| 图像参数集(Picture Parameter Set, PPS)。 |
| 分界符。 |
| 序列结束。 |
| 码流结束。 |
| 填充。 |
| 保留。 |
| 未使用。 |
因此,如果要知道 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增强监视系统,广泛应用于智慧交通、智慧城市、智慧机场等大场景智能监控领域。