ZigZag Sin
登 陆
上一篇:*代码-读取 AnnexB 格式的 H.264 数据 下一篇:*代码-从 NALU 中提取 EBSP 和 RBSP

EBSP, RBSP, SODB

乔红
2021-1-16 18:06 阅读 5635

引言

上一节,我们成功得将一个文件之内的 NALU 一个一个得读了出来。接下来,我们就可以解析 NALU 中的内容了。不过在解析之前,我们还要对读出来的 NALU 数据进行一些处理才能进一步解析。

EBSP 扩展字节序列载荷

首先我们来介绍一下 EBSP 扩展字节序列载荷。首先要说明的是,H.264 标准中其实并没有这个概念,这个概念是出现在 JM 项目里面的。在 JM 中,将带有 startcode 的 NALU 的去掉 0 0 0 1 的 startcode 的后的数据叫做 EBSP。在这里,我们不妨沿用这个概念,也用 EBSP 来指代去掉 startcode 的 NALU 数据。

EBSP

RBSP 原始字节序列载荷

还有一个概念叫做 RBSP。RBSP 是 H.264 标准中的概念,要说 RBSP,我们就要提到一个我们之前提到的概念,防竞争字节 (Emulation Prevention Bytes)。

我们知道, H.264 在编码的时候,会加上 0x03 的字节来防止和 startcode 产生冲突。而在读取到 NALU 之后,我们就要把编码时候加上的防竞争字节去掉。

而将 NALU 去掉 startcode ,接着又去掉防竞争字节之后的数据,就叫做 RBSP。

RBSP

SODB 数据比特串

视频在编码的时候,会将一比特一比特的数据写入到码流里面,而在写完之后,就有可能发生一种情况,就是写入的数据数量不满一个字节。

SODB

可以看上图数据一共 19 bit,最后多出来 3 bit 的数据,不满一个字节,这在后续操作中会大大不便,所以在构建 RBSP 的时候,会将最后不满一个字节的情况进行补齐。

补齐的规则如下:

rbsp_trailing_bits( ) {
    rbsp_stop_one_bit /* equal to 1 */
    while( !byte_aligned( ) )
        rbsp_alignment_zero_bit /* equal to 0 */
}

先写入 1 bit 数据,数据内容是 1,然后开始补齐 0,直到补齐到一整个字节。

SODB

而在解码的时候,也要把补齐的部分去掉,RBSP 去掉补齐的数据后,就是 SODB。

这里其实还有另外一种情况,那就是你的码流在写入的时候,刚刚好写满了一整个字节,就如同下图

SODB

那么这种情况下拖尾内容要怎么处理呢?其实阅读 rbsp_trailing_bits 的这个规则,我们就可以知道,这种的拖尾系数,是新增加一个字节。新增加的字节第一位是 1,后面都是 0。

SODB

总结

SODB

上一篇:*代码-读取 AnnexB 格式的 H.264 数据 下一篇:*代码-从 NALU 中提取 EBSP 和 RBSP
给我买个键盘吧。。。求打赏。。。
欢迎加群,一起交流~~~

simp00@163.com

写的太好了

2021-12-06 17:48:54

1055083441@qq.com

通俗易懂,nb

2021-03-04 11:28:26