当前位置: 代码迷 >> 综合 >> H264/AVC 用于传输的编码工具
  详细解决方案

H264/AVC 用于传输的编码工具

热度:44   发布时间:2023-12-21 07:13:52.0

考虑到H.264的大多数应用都涉及到对压缩比特流的通信或存储,该标准指定了许多旨在支持高效和健壮传输的特性或工具。Baseline和Extended Profiles支持Redundant Slice、Arbitrary Slice Order和Flexible Macroblock Order;Extended Profiles支持Data Partitioned Slice、SI Slice和SP Slice。值得注意的是,这些特性还没有被商业H.264/AVC编解码器广泛采用,大多数编解码器倾向于使用Constrained Baseline, Main和High Profile。


Redundant slices

标记为“冗余”的片包含编码帧的部分或全部的冗余表示。在正常操作中,解码器从“非冗余”片重建帧,并丢弃任何冗余片。然而,如果主要解码帧损坏,例如由于传输错误,解码器可以用来自冗余片的解码数据替换损坏区域(如果可用的话)。因此,在有传输错误或丢失的情况下,向编码的比特流添加冗余片可以提高性能,但要以增加传输比特数为代价,从而降低压缩性能。


Arbitrary Slice Order(ASO)

ASO使得编码帧中的切片可以以任何解码顺序排列。 ASO使用时应该有这种情况:如果解码帧中任何片中的第一个宏块具有比同一帧中之前解码的片中的第一个宏块更小的宏块地址,这样一来,切片以非光栅顺序传输。 这可能有助于解码器错误隐藏。 下图显示了一个示例。

片在码流中按 0、1、2、3 的顺序编码。但是,片2中的第一个宏块紧接在 片 0 中的最后一个宏块之后,并且其地址比片 1 中的第一个宏块小。例如,如果错误或数据包丢失影响切片 0 和 1,解码器可能更容易使用正确解码的切片 2 和 3 隐藏错误的影响。


Slice Groups / Flexible Macroblock Order(FMO)

灵活的宏块排序使一个编码帧中的宏块被分配到几个片组中的一个,每个片组包含组成一个帧的宏块的子集,每个包含一个或多个片。在一个片组中,宏块按光栅顺序编码,但在一个片组中,连续的宏块不一定相邻。如果一个编码的帧包含多个片组,那么灵活的宏块排序就会被采用。宏块的分配由宏块分配映射决定,该映射指出每个宏块属于哪个片组。表8.5列出了不同类型的宏块分配映射。

FMO可以提高容错能力,因为每个片都可以独立于其他片进行解码。例如,如果一个片或片组在使用交错排序的图片中丢失,则可以使用空间错误隐藏,通过在剩余片组中解码的宏块之间垂直插值,从而合理有效地隐藏损坏的区域。


SP和SI片

一个常见的需求是:视频解码器能够在多个编码的码流之间切换。例如,相同的视频序列被编码成为多种比特率的码流,以便在互联网传输。解码器尝试解码它可以接收的最高比特率的码流,然而,在数据吞吐量下降能,解码器需要能够自动切换到比特率较低的码流。

说一下SI:

如下图所示,解码器正在解码码流A,并想切换到解码码流B。为简单起见,假设每个帧都被编码为单个slice,并以前面已编码帧作为参考帧进行预测。在解码A0和A1(P slice)之后,解码器想转到码流B,解码B2和B3。如果码流B中的所有slice都以P的方式进行解码,那么解码器无法重建出B2,因为没有B1。一种策略就是把B2用I的方式进行编码。然而这种方式会产生巨大的比特,从而在switch point出现一个码流的峰值,码流中出现峰值的情况是我们不想看到的。

说一下SP:

设计SP的目的就是支持在序列之间切换时,不会产生SI那样的峰值。下图中一共有三个SP的slice,分别是SP-A2、SP-B2和SP-AB2。其中,SP-A2的参考是A1、SP-B2的参考是B2、SP-AB2的参考是A1。参考B1解码的到的B2和参考AB2得到的B2是完全一样的。

下面展示了解码器从码流A切换到码流B的步骤:

编码一个SP-A2和SP-B2的流程示意图如下:

它是通过从当前帧中减去参考帧的解码版本,然后对残差进行编码而产生的。

编码一个SP-AB2的流程示意图如下:

这里的MC是以A1的解码帧A1‘为参考帧,进行B2的运动补偿。得到的运动补偿预测结果进行变换和量化。对减法后的残差进行编码和传输。

除了在序列之间切换,SP还可以用于随机访问功能,例如从第0帧直接跳到第10帧,就需要一个sp片A0-10。解码器先解码A0,再解码A0-10从而得到A0到A10的预测。如下图所示:


Data partitioned slice(数据分割/划分片)

组成一个片的编码数据被放置在三个独立的Data Partition A、B和C中,每个分区包含编码片的一个子集。Partition A包含片头和片中每个宏块的头数据;Partition B包含I和SI片宏块的编码残差数据;Partition C包含P、B和SP片宏块的编码残差数据。每个Partition被放置在一个独立的NALU,因此可以单独传输。

如果A数据丢失,则很可能很难或不可能重建该片;由于intra残差中的错误可能在解码器处被隐藏,所以B对错误的容忍度更高;C对错误的容忍度是最高的,因为在inter编码的数据中隐藏错误相对容易。为提升稳定性,对分区A和分区B应用正向纠错,或者通过不同的通道传输分区类型,为分区A选择最可靠的通道。