iOS VideoToolBox 解码 HEVC Open-GOP 视频的问题排查

iOS VideoToolBox 解码 HEVC Open-GOP 视频的问题排查

💡 原文中文,约1900字,阅读约需5分钟。
📝

内容提要

最近项目中遇到一个问题,用户上传一个 H.265 编码的视频,在 iOS 平台上解码时出现异常。经过调研分析,发现问题出在视频格式的解码处理流程上,特别是在 Open-GOP 格式下。解决办法是丢弃 B 帧,需要用到 H.265 相关的知识内容来确定 B 帧。

🔎

延伸解读

Open-GOP 的 Seek 陷阱

Open-GOP 的 I 帧并非 IDR 帧,其后的 B 帧可能参考前一个 GOP 的帧。当 Seek 到该 I 帧时,若未提供前面的参考帧,B 帧就会因缺少参考而解码失败。这解释了 iOS 16 花屏和 iOS 17 报错 -12909 的现象,也说明问题根源在视频格式而非解码 API 调用。

为何选择丢弃 B 帧

解决 Open-GOP 解码失败有两种思路:补全 B 帧所需的参考帧,或直接丢弃 B 帧。补参考帧需要额外读取并解码前面的帧,耗时较高;丢弃 B 帧则更轻量。文章最终采用丢弃 B 帧的方案,这要求准确识别哪些 NALU 属于 B 帧,因此需要借助 H.265 的 NALU 类型知识。

VideoToolBox 与 AssetReader 的取舍

AssetReader 对开发者而言接近黑盒,Play 和 Seek 行为由 API 控制,可操作空间小,且官方论坛也有卡死反馈。VideoToolBox 虽然前置步骤更多,如需判断 NALU 类型、提取 VPS/SPS/PPS,但可控性更强。文章因此将排查重点放在 VideoToolBox 上,并确认其使用流程无误后,转向视频格式处理逻辑。

❓

Q&A

在 iOS 平台上解码 H.265 视频时遇到什么问题?

在 iOS 平台上解码 H.265 视频时,特别是 Open-GOP 格式的视频,可能会出现卡死、花屏或解码失败的情况。

为什么 Open-GOP 格式的视频在解码时会失败?

Open-GOP 格式的视频在解码时失败是因为 I 帧后面的 B 帧缺少参考内容,导致解码器无法正常工作。

如何解决 H.265 Open-GOP 视频解码中的 B 帧问题?

解决 H.265 Open-GOP 视频解码中的 B 帧问题的方法是丢弃 B 帧,而不是尝试补充参考帧。

VideoToolBox 解码与 AssetReader 解码有什么不同?

VideoToolBox 解码需要更多的前置操作,如判断 NALU 类型和提取 VPS、SPS、PPS,而 AssetReader 解码被视为黑盒,开发者可操作空间较小。

在 iOS 16 和 iOS 17 上解码 H.265 视频时分别会出现什么错误?

在 iOS 16 上解码 H.265 视频时可能出现花屏,而在 iOS 17 上则会解码失败,错误码为 -12909。

解码 H.265 视频时需要提取哪些 NALU 类型?

解码 H.265 视频时需要提取 VPS、SPS、PPS 和一个额外的 VPS NALU 类型。

🏷️

标签

➡️

继续阅读