第一章 前言
第三章 有关 SPS 和 PPS 的一切
第四章 有关 Slice 的一切
第七章 帧间编码
第八章 残差的熵编码: CAVLC 和 CABAC
上一节,我们成功得将一个文件之内的 NALU 一个一个得读了出来。接下来,我们就可以解析 NALU 中的内容了。不过在解析之前,我们还要对读出来的 NALU 数据进行一些处理才能进一步解析。
首先我们来介绍一下 EBSP 扩展字节序列载荷。首先要说明的是,H.264 标准中其实并没有这个概念,这个概念是出现在 JM 项目里面的。在 JM 中,将带有 startcode 的 NALU 的去掉 0 0 0 1 的 startcode 的后的数据叫做 EBSP。在这里,我们不妨沿用这个概念,也用 EBSP 来指代去掉 startcode 的 NALU 数据。
还有一个概念叫做 RBSP。RBSP 是 H.264 标准中的概念,要说 RBSP,我们就要提到一个我们之前提到的概念,防竞争字节 (Emulation Prevention Bytes)。
我们知道, H.264 在编码的时候,会加上 0x03 的字节来防止和 startcode 产生冲突。而在读取到 NALU 之后,我们就要把编码时候加上的防竞争字节去掉。
而将 NALU 去掉 startcode ,接着又去掉防竞争字节之后的数据,就叫做 RBSP。
视频在编码的时候,会将一比特一比特的数据写入到码流里面,而在写完之后,就有可能发生一种情况,就是写入的数据数量不满一个字节。
可以看上图数据一共 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,直到补齐到一整个字节。
而在解码的时候,也要把补齐的部分去掉,RBSP 去掉补齐的数据后,就是 SODB。
这里其实还有另外一种情况,那就是你的码流在写入的时候,刚刚好写满了一整个字节,就如同下图
那么这种情况下拖尾内容要怎么处理呢?其实阅读 rbsp_trailing_bits 的这个规则,我们就可以知道,这种的拖尾系数,是新增加一个字节。新增加的字节第一位是 1,后面都是 0。
simp00@163.com
2021-12-06 17:48:54
1055083441@qq.com
2021-03-04 11:28:26