0

尝试在 iPad Pro OS v14.3 上解码帧时,我遇到了与此处描述的相同的问题(我也在使用Olivia Stork 的示例):

25%的图片数据被正确解码,剩下的图片只是绿色。

iPad Pro OS v14.3 上的解码图像如下所示(图像被转换并保存在解码器回调中,如此所述,因此不仅仅是显示问题)。

原始图像看起来像这样

图像在 Windows10 上使用 NVIDIA NVENC (Media Foundation) 进行编码。

如链接中所述,我在帧图片数据中搜索了额外的 4 字节 NALU 起始代码,但对于 SPS、PPS 和 IDR 图片数据,只有三个预期的。

我在 Windows10 上运行了另一个 Media Foundation 解码器应用程序,它可以正确解码来自完全相同源的帧。

我现在正在努力寻找问题的原因..有人有什么想法吗?

提前致谢。抢

- 编辑 2021-01-11

我发现在 NALU 类型 5 的 IDR 图片数据块中实际上还有三个额外的 3 字节起始码(0x000001)。

我试图用以下数据块的长度(大端)替换这些起始代码,如此处所述但结果相同。

我还尝试按照此处所述添加仿真预防字节(0x000001 => 0x000301),但这也没有什么区别。

也许我被误导了,这些起始代码与问题无关..至少它们不仅仅是随机图像数据,因为它们总是出现在图片数据块中的相同位置(索引)。目前我的想法已经不多了..有人提示吗?

- 编辑 2021-01-14

我想出了更多的东西:

出于完全缺乏想法,我复制了块开头最后一个起始码之后的图片数据(紧跟在 4 字节 NALU 起始码之后)。我曾期望——如果这能奏效的话——在解码图像的顶部看到原始图像的最后四分之一,但令我惊讶的是,解码图像看起来像这样

我对第二个和第三个起始码之后的图片数据进行了同样的尝试,解码后的图像看起来像这样图像数据被正确解码,甚至在正确的位置(与原始图像相比)。

即使我剥离所有 3 字节起始码并复制 4 字节起始码后连接的图片数据,结果也是一样的,只有 25% 的图像被解码。所以额外的 3 字节起始码显然不是问题。必须有一些设置告诉解码器只解码图像的 25%。我会提示 CMVideoFormatDescription,但据我所知,它看起来还不错。

我也想知道解码器如何知道在哪里显示不同的图片数据块。要么在图片数据中的某处定义了偏移量,要么编码器以某种方式添加了每个像素的 xy 位置。

4

1 回答 1

0

我设法找到了问题的原因:IDE图片数据块中的3字节起始码必须替换为4字节起始码。

所以首先用 4 字节起始码替换所有 3 字节起始码。然后将 4 字节的起始码替换为后面的数据块的长度(大端)。切片应该像这样排列(正如'Blackie'在这里提到的):

[4byte slice1 大小][slice1 数据][4byte slice2 大小][slice2 数据]...[4byte slice4 大小][slice4 数据]

切记不要在切片大小中包含起始代码长度。

更改后,我的框架完全显示了。

顺便说一下:在每个NALU的头数据(参数'first_mb_in_slice')中指定了在哪里显示不同的图片数据块的信息。

这里有一个非常好的 c# 示例如何提取 NALU 标头数据。您几乎可以 1:1 复制它。

于 2021-01-23T07:19:02.387 回答