惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
I
InfoQ
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 【当耐特】
小众软件
小众软件
B
Blog RSS Feed
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
Engineering at Meta
Engineering at Meta
人人都是产品经理
人人都是产品经理
Microsoft Security Blog
Microsoft Security Blog
Last Week in AI
Last Week in AI
H
Help Net Security
爱范儿
爱范儿
云风的 BLOG
云风的 BLOG
博客园 - 司徒正美
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Microsoft Azure Blog
Microsoft Azure Blog
L
LangChain Blog
WordPress大学
WordPress大学
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
腾讯CDC

音视频开发进阶

音视频教程-第三节 音视频教程-第二节 真的,AI 可能就是新时代的信息差 充值 Cursor 之后,工作有了哪些变化?🤔 个人'蒸馏'大模型能做哪些有意思的事情 DeepSeek 大模型在 Mac 上的部署和运行 音视频教程-第一节 【WebRTC 专栏】-- Android 开发集成 WebRTC 库的几种方式 【WebRTC 专栏】-- 在 Mac M1 等系列芯片编译和开发 WebRTC-Android 库 Meta Llama3 大模型在 Mac 上的部署和运行 Flutter 状态管理之 InheritedWidget 使用和分析 用 ChatGPT 回答技术问题怎么样 ? 音视频开发系统入门大致路线 UE 4.27 添加自定义 ShadingModel 用 UE4 虚幻引擎做个捏脸小功能~~ UE4 材质练习 之 凹凸贴图偏移的使用 UE4 材质练习系列基础 OpenGL上下文创建以及共享机制 007 | 播放器系列专栏-解析 MP4 文件读取信息 006 | 播放器系列专栏-在 Mac 上查看 MP4 格式信息 干货 | 快速抽取缩略图是怎么练成的? 关于直播、WebRTC、FFmpeg 的那些事 005 | 播放器系列专栏-在 Windows 上查看 MP4 格式信息 将音视频中的花屏、绿屏、黑屏问题一网打尽 关于音视频里面的解码帧率和渲染帧率 004 | 播放器系列专栏-认识MP4视频(下) 003 | 播放器系列专栏-认识MP4视频(上) 入门或者转行音视频,应该要怎么做? H264视频文件如何缩放分辨率 002 | 播放器系列专栏-FFmpeg依赖库的配置
iOS VideoToolBox 解码 HEVC Open-GOP 视频的问题排查
音视频开发进阶 · 2024-03-29 · via 音视频开发进阶

一个专注音视频领域的小圈子

最近项目中遇到一个问题,用户上传一个 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 上则是报 -12909 的错误码,并且 B 帧后面所有的帧在 Seek 后顺序播放的情况下也解码失败了。

通过上面的现象定位到具体原因就是 Open-GOP 格式下 Seek 的 I 帧并不是 IDR 帧,导致 B 帧解码失败,从而影响了整个解码器运行。

解决办法要么把 B 帧要参考的帧给补上,要么把这个 B 帧给丢了。显然第一种太耗时了,不可取,只能把 B 帧给丢了。那么接下来要做的就是如何确定谁是 B 帧。

这里需要用到 H.265 相关的知识内容了,尤其是 H.265 的 NALU 类型,具体如下:

NAL_TRAIL_N = 0, 
NAL_TRAIL_R = 1, 
NAL_TSA_N = 2, 
NAL_TSA_R = 3, 
NAL_STSA_N = 4, 
NAL_STSA_R = 5, 
NAL_RADL_N = 6, 
NAL_RADL_R = 7, 
NAL_RASL_N = 8, 
NAL_RASL_R = 9, 
NAL_BLA_W_LP = 16, 
NAL_BLA_W_RADL = 17, 
NAL_BLA_N_LP = 18, 
NAL_IDR_W_RADL = 19, 
NAL_IDR_N_LP = 20, 
NAL_CRA_NUT = 21, 
NAL_VPS = 32, 
NAL_SPS = 33, 
NAL_PPS = 34, 
NAL_AUD = 35, 
NAL_EOS_NUT = 36, 
NAL_EOB_NUT = 37, 
NAL_FD_NUT = 38, 
NAL_SEI_PREFIX = 39, 
NAL_SEI_SUFFIX = 40,

欢迎扫码阅读或者加入【音视频开发进阶】知识星球,看更多精彩内容!!!

星球介绍: 一个音视频领域专业问答的小圈子

文章链接:https://t.zsxq.com/18h4Z1Xno

原创文章,转载请注明来源:    iOS VideoToolBox 解码 HEVC Open-GOP 视频的问题排查