AUD从哪来
Access Unit Delimiter访问单元分隔符
以TS文件为例,下面开始剥洋葱~
- TS由一个一个188字节的TS数据包组成。有PCR和包计数(0-15)
- 去掉TS包头,根据TS包的PID过滤,承载数据组成的就是PES流(打包的原始流),PES由一个个不定长的PES包组成。里面有PTS/DTS,
- 去掉PES头信息得到ES(基本码流),也就是H264流或者AAC流,或者…
- H264由一个个NAL-网络提取层组成。
- NAL是有起始码和一个一个NALU-网络提取层单元组成。
- NALU由NALU包头和RBSP组成。包头占一个字节,最后5位指定了后面的BRSP的类型。当类型为9时,代表AUD,也就是Access Unit Delimiter访问单元分隔符。
AUD 的语法
基本还是NALU头+RBSP,下面是其RBSP定义
access_unit_delimiter_rbsp( ) {
primary_pic_type 3 bit
rbsp_trailing_bits( )
}
rbsp_trailing_bits 是填充字节,也就是为了对齐1个字节,先填充1bit1,再填充若干bit0。填充前叫做SODB-数据比特串,填充后叫做RBSP-原始字节序列载荷。
AUD 的意义
AUD 是分解符,也就是AUD之间是一个完整的帧。
primary_pic_type 指明了这个帧的类型。
primary_pic_type | 可能会出现在基本编码图像中的 slice_type 值 |
0 | I |
1 | I, P |
2 | I, P, B |
3 | SI |
4 | SI, SP |
5 | I, SI |
6 | I, SI, P, SP |
7 | I, SI, P, SP, B |
这部分为了帮助理解,看下面百科内容。
实例
00 00 00 01 09 10
00 00 00 01 为NAL起始码
09 说明类型为9,也就是AUD。
10 说明后面跟的是I帧
以下摘自百度百科:
地址:https://baike.baidu.com/item/%E5%9B%BE%E5%83%8F%E5%B8%A7
H.264 是一次概念的革新,它打破常规,完全没有 I 帧、P帧、B 帧的概念,也没有 IDR 帧的概念。对于 H.264 中出现的一些概念从大到小排序依次是:序列、图像、片组、片、NALU、宏块、亚宏块、块、像素。
这里有几点值得说明:
(1)、在 H.264 协议中图像是个集合概念,顶场、低场、帧都可以称为图像(本文后面内容用到图像概念时都是集合概念,不再重复说明)。因此我们可以知道,对于 H.264 协议来说,我们平常所熟悉的那些称呼,例如:I 帧、P 帧、B 帧等等,实际上都是我们把图像这个概念具体化和细小化了。我们在 H.264 里提到的“帧”通常就是指不分场的图像;
(2)、如果不采用 FMO(灵活宏块排序) 机制,则一幅图像只有一个片组;
(3)、如果不使用多个片,则一个片组只有一个片;
(4)、如果不采用 DP(数据分割)机制,则一个片就是一个 NALU,一个 NALU 也就是一个片。否则,一个片由三个 NALU 组成(即标准“表7-1”中 nal_unit_type 值为 2、3、4 的三个 NALU 属于一个片);
(5)、以上所述的片和 NALU 的大小关系并不是抽象概念上的从属关系。从概念的从属关系上来看,NALU其实又是片的一个集合概念,例如:标准“表7-1”中 nal_unit_type 值为 5 的 NALU 包括 I 片或者 SI 片。
一幅图像根据组成它的片类型来分,可以分为标准“表7-5”中的 8 种类型。我们平常应用中所最常见到的其实是这些类型的特例。例如:我们平常所谓的“I 帧”和“IDR 帧”,其实是 primary_pic_type 值为 0 的图像,我们平常所谓的“P帧”其实是 primary_pic_type 值为 1 的图像的特例,我们平常所谓的“B帧”其实是 primary_pic_type 值为 2 的图像的特例。
一幅图像根据概念来分可以分为两种:IDR 图像和非 IDR 图像。一幅图像是否是 IDR 图像是由组成该图像的 NALU 决定的,如果组成该图像的 NALU 为标准“表7-1”中 nal_unit_type 值为 5 的 NALU,则该图像为 IDR 图像,否则为非 IDR 图像。
以下来自转载
转载地址:javascript:void(0)
H.264 的功能分为两层:视频编码层(VCL, Video Coding Layer)和网络提取层(NAL,Network Abstraction Layer)。VCL 数据即编码处理的输出,它表示被压缩编码后的视频数据序列。
VCL存在三种封装形式:SODB, RBSP, EBSP.
SODB:数据比特串,即编码后的最原始的数据;
RBSP:原始字节序列载荷,即在SODB的后面添加了trailing bits,即一个bit 1和若干个bit 0,以便字节对齐;
EBSP:扩展字节序列载荷,即在RBSP的基础上添加了仿校验字节0x03.—-annexb
二、联系、区别与作用
SODB是编码收的原始数据,经过封装后为RBSP,RBSP是NAL单元的数据部分的封装格式。在NAL内部为了防止与起始码竞争,从而引入填充字节0x03,这样便形成了EBSP。
1、RBSP的形成过程
如果SODB的内容是空的,那么RBSP的内容也是空的;
否则,RBSP的第一个字节取自SODB的第1到第8个比特,RBSP字节内部按照从左到右从高到低的顺序排列。以此类推,RBSP中的每个字节都直接取自SODP的相应比特。RBSP的最后一个字节包含SODB的最后几个比特,以及trailing bits。其中,trailing bits的第一个比特为1,其余的比特为0,保证字节对齐。最后,在结尾添加0x0000,即CABAC ZERO WORD,从而形成RBSP。
2、EBSP的形成过程
NALU数据+起始码就形成了AnnexB格式,起始码包括两种,0x00000001和0x000001。为了不让NALU的主体与起始码之间产生竞争,在对RBSP进行扫描时,如果遇到连续的两个0x00字节,则在该两个字节后面添加一个0x03字节。在解码的时候将该0x03字节去掉,也成为脱壳操作。
通过该种方式形成EBSP,这需要将近两倍的整帧图像码流大小。为了减少存储器需求,在每个macroblock结束后,即检查该macroblock的SODB的起始码竞争问题,并保留SODB的最后两个字节的零字节个数,以便与下一个macroblock的SODB的开始字节形成连续的起始码竞争检测。对一帧图像的最后一个macroblock,先添加结尾停止bit,在检查起始码竞争。
注:起始码包括两种情况,即4字节和3字节。在SPS、PPS和Access Unit的第一个NALU使用4字节起始码,其余情况均使用3字节起始码。
起始码:如果NALU 对应的Slice 为一帧的开始,则用4 字节表示,即0x00000001;否则用3 字节表示,0x000001。