H264的RBSP类型之AUD

AUD从哪来

Access Unit Delimiter访问单元分隔符

以TS文件为例,下面开始剥洋葱~

  1. TS由一个一个188字节的TS数据包组成。有PCR和包计数(0-15)
  2. 去掉TS包头,根据TS包的PID过滤,承载数据组成的就是PES流(打包的原始流),PES由一个个不定长的PES包组成。里面有PTS/DTS,
  3. 去掉PES头信息得到ES(基本码流),也就是H264流或者AAC流,或者…
  4. H264由一个个NAL-网络提取层组成。
  5. NAL是有起始码和一个一个NALU-网络提取层单元组成。
  6. 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 值
0I
1I, P
2I, P, B
3SI
4SI, SP
5I, SI
6I, SI, P, SP
7I, 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 值为 234 的三个 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 图像。

以下来自转载

转载地址:https://blog.csdn.net/u010289908/article/details/45742573

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。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值