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

在iOS项目中遇到HEVC Open-GOP视频解码问题,使用AssetReader解码时卡死,VideoToolBox解码在iOS 16和17上出现异常。分析发现Open-GOP格式的B帧缺少参考内容导致解码失败。解决方案是识别并丢弃可能导致问题的NALU类型,避免影响解码器运行。参考FFmpeg源码实现丢帧策略,成功修复问题。
摘要由CSDN通过智能技术生成

最近项目中遇到一个问题,用户上传一个 H.265 编码,并且是 Open-GOP 格式的某个视频。

该视频在 iOS 平台上用 AssetReader 进行解码,频繁 Seek 的场景下会出现卡死。用 VideoToolBox 解码也会有异常,具体表现在 iOS 16 的系统上出现花屏,iOS 17 的系统上解码失败,错误码是 kVTVideoDecoderBadDataErr (-12909)。

通过调研分析,AssetReader 解码对于开发者来说相当于是个黑盒,Play 和 Seek 行为都是通过指定 API 来完成的,可操作的空间比较小,并且官方论坛上也有反馈卡死的行为,因此暂时不处理这个,重点放在 VideoToolBox 上,毕竟竞品也是用 VideoToolBox 解码的,而且还一切正常。

VideoToolBox 的解码流程和 MediaCodec 还不一样,需要的前置操作比较多,比如判断 NALU 类型,提取 VPS、SPS、PPS 等,具体流程可以参考这里,讲的非常详细了。

https://stackoverflow.com/questions/29525000/how-to-use-videotoolbox-to-decompress-h-264-video-stream 。

上面是关于 H.264 的解码,对于要处理的 H.265 & Open-GOP 格式的视频还是不够的,不过他们的 API 调用流程都是一样的,H.265 的视频需要多提取一个 VPS 的 NALU 。

通过比对校验,确认了 VideoToolBox 的使用流程上没有问题之后,那么就是关于视频格式的解码处理流程有问题了。

重点还是在 Open-GOP 格式上,它的 GOP 结构是这样的:

I B B P B B P B B P B B I B B P B B P B(显示顺序)

I P B B P B B P B B I B B P B B P B B…(解码顺序)

解码顺序中,在 I 帧后面跟了两个 B 帧,而这两个 B 帧还参考了 I 帧前面 GOP 的内容。

假设 Seek 到 I 帧,然后接着解码后面 B 帧,由于 I 帧前面的内容并没有读取送给解码器,所以 B 帧缺少了参考内容导致解码失败,在 iOS 16 上表现为画面花屏,在 iOS 17 上则是报 -1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值