【发布时间】:2021-01-05 09:37:50
【问题描述】:
在 iPad Pro OS v14.3 上尝试解码帧时,我遇到了与 here 所述相同的问题(我也在使用 Olivia Stork's example):
25%的图片数据解码正确,剩下的图片只是绿色。
iPad Pro OS v14.3 上的解码图像看起来像this(图像被转换并保存在解码器回调中,如here 所述,因此不仅仅是显示问题)。
原始图像看起来像this。
图像在 Windows10 上使用 NVIDIA NVENC (Media Foundation) 进行编码。
我在帧图片数据中搜索了链接中描述的附加 4 字节 NALU 起始码,但对于 SPS、PPS 和 IDR 图片数据,只有三个预期的。
我在 Windows10 上运行了另一个 Media Foundation 解码器应用程序,它可以正确解码来自完全相同来源的帧。
我现在正在努力寻找问题的原因.. 任何人有什么想法吗?
提前致谢。抢
- 编辑 2021-01-11:
我发现在 NALU 类型 5 的 IDR 图片数据块中实际上还有三个额外的 3 字节起始码 (0x000001)。
如here 所述,我尝试将这些起始代码替换为以下数据块的长度(大端序),但结果相同。
我还尝试按照here 的描述添加模拟预防字节 (0x000001 => 0x000301),但这也没有任何区别。
也许我被误导了,这些起始代码与问题无关..至少它们不仅仅是随机图像数据,因为它们总是出现在图片数据块中的相同位置(索引)。目前我的想法已经不多了..有人提示吗?
- 编辑 2021-01-14:
我想出了更多的东西:
出于完全缺乏想法,我复制了块开头最后一个起始代码之后的图片数据(紧跟在 4 字节 NALU 起始代码之后)。 我曾期望 - 如果这能奏效的话 - 会在解码图像的顶部看到原始图像的最后四分之一,但令我惊讶的是,解码后的图像看起来像 this。
我对第二个和第三个起始码之后的图片数据进行了同样的尝试,解码后的图像看起来像this和this: 图像数据被正确解码,甚至在正确的位置(对比original image)。
即使我去掉所有的 3 字节起始码并复制 4 字节起始码后拼接的图片数据,结果是一样的,只有 25% 的图像被解码。所以额外的 3 字节起始码显然不是问题。必须有一些设置告诉解码器只解码图像的 25%。我会提示 CMVideoFormatDescription,但据我所知,它看起来还不错。
我也想知道解码器如何知道在哪里显示不同的图片数据块。要么在图片数据中的某处定义了偏移量,要么编码器以某种方式添加了每个像素的 xy 位置..
【问题讨论】:
标签: ios xamarin.ios h.264 ms-media-foundation video-toolbox