12.5. Video Telephony or Streaming with FUs and Forward Error Correction (采用 FU 与前向纠错的视频电话或流媒体)
12.5. Video Telephony or Streaming with FUs and Forward Error Correction (采用 FU 与前向纠错 (Forward Error Correction, FEC) 的视频电话或流媒体)
该方案已实现, 并表明在较高丢包率下尤其具有良好的性能 [19]。
对于无法使用重传的场景, 对抗分组丢失最有效的方式是前向纠错 (FEC)。尽管应用层端到端使用 FEC 往往不如对各个链路进行基于 FEC 的保护那样高效 (尤其是当传输路径中存在特性不同的链路时), 但在某些场景下应用层端到端 FEC 不可避免。RFC 5109 [18] 提供了在分组丢失环境中使用通用应用层端到端 FEC 的手段。通过对不同分组中相同比特位置上的比特应用 XOR 运算来生成二元前向纠错码。该二元码可用参数 (n,k) 规定, 其中 k 为连接中使用的信息分组数, n 为为 k 个信息分组生成的分组总数, 即为 k 个信息分组生成 n-k 个奇偶校验分组。
在 RFC 5109 框架内使用参数为 (n,k) 的码时, 以下性质是众所周知的:
a) 若仅对一个 RTP 分组应用, RFC 5109 只提供分组重复。
b) 若经 XOR 连接的分组长度相等, RFC 5109 的比特率效率最高。
c) 在相同的分组丢包概率 p 以及固定的 k 下, n 越大, 残余差错概率越小。例如, 分组丢包率为 10%, k=1, n=2 时, 残余差错概率约为 1%, 而 n=3 时约为 0.1%。
d) 在相同的分组丢包概率 p 以及固定的码率 k/n 下, n 越大, 残余差错概率越小。例如, 分组丢包概率 p=10%, k=1, n=2 时, 残余差错率约为 1%, 而对扩展 Golay 码 k=12, n=24, 残余差错率约为 0.01%。
将 RFC 5109 与 H.264 基线编码视频结合使用且不使用 FU (Fragmentation Unit) 时, 可考虑若干选项:
-
视频编码器产生的 NAL 单元中, 每个视频帧在单个片中编码。应用 FEC 时, 可使用简单码, 例如 (n=2, k=1)。即每个 NAL 单元基本上只是被重复。缺点显然是按上文 d) 的码性能较差, 且灵活性低, 因为只能使用 (n, k=1) 码。
-
视频编码器产生的 NAL 单元中, 每个视频帧在一个或多个连续片中编码。应用 FEC 时, 可对 NAL 单元序列使用更好的码, 例如 (n=24, k=12)。根据每帧的 RTP 分组数, 一次丢失可能引入显著延迟, 当每帧使用更多 RTP 分组时延迟会降低。也可能连接长度完全不同的分组, 从而按上文 b) 降低比特率效率。然而, 若稍加注意且片大小为 1 kb 或更大, 可产生相近长度 (相差 100-200 字节), 不会灾难性地降低比特效率。
-
视频编码器产生的 NAL 单元中, 某帧包含 k 个可能几乎等长的片。然后应用 FEC 时, 可对每帧的 NAL 单元序列使用更好的码, 例如 (n=24, k=12)。与上文 2) 相比延迟可能降低, 但缺点明显。首先, 由于片结构编码降低了帧内预测且需要额外片开销, 编码视频的效率显著降低。其次, 对于预编码内容或通过网关运行时, 视频通常未按 k 个片适当编码以应用 FEC。最后, 产生 k 个等长片的视频编码并不简单, 可能需要不止一遍编码。
通过将 FU 与 FEC 结合使用, 可避免上述许多缺点。每个 NAL 单元可分割为任意数量、基本等长的 FU, 因此即使编码器未努力产生等长片, 仍可使用合理的 k 和 n 应用 FEC。例如, 包含整帧的编码片 NAL 单元可分割为 k 个 FU, 并应用奇偶校验码 (n=k+1, k)。然而, 除非所有产生的片段都能恢复, 否则整个片将丢失。因此, 丢失的区域大于将帧分割为多个片时的情况。
所介绍的技术使得即使不存在额外的信源编码层冗余 (如周期性帧内帧), 仍可获得良好的传输差错容忍度。因此, 同一编码视频序列既可在无差错传输下获得最大压缩效率与质量, 也可在易错网络上传输。此外, 该技术允许对预编码序列应用 FEC 而不增加延迟。此时, 未针对易错网络编码的预编码序列仍可几乎可靠地传输, 而无需大量延迟。此外, 等长的 FU 可对比特率高效地使用 RFC 5109。
若差错概率取决于所传输分组的长度 (例如移动传输 [15]), 使用 FU 与 FEC 的好处更加明显。基本上, FU 大小的灵活性允许对每个 NAL 单元应用适当的 FEC 以及对 NAL 单元进行不等差错保护。
使用 FU 与 FEC 时, 所产生的开销很大, 但与未应用 FEC 时必须用于帧内编码宏块的比特数量级相同。在 [19] 中已表明, 在相同差错率与相同总比特率 (含开销) 下, 基于 FEC 的方法总体性能提高了质量。