【问题标题】:NVIDIA NVENC (Media Foundation) encoded h.264 frames not decoded properly using VideoToolboxNVIDIA NVENC(媒体基金会)编码的 h.264 帧未使用 VideoToolbox 正确解码
【发布时间】: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

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

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

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

【问题讨论】:

    标签: ios xamarin.ios h.264 ms-media-foundation video-toolbox


    【解决方案1】:

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

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

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

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

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

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

    有一个很好的c#例子here如何提取NALU头数据。你几乎可以 1:1 复制它。

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 2015-05-11
      • 2013-02-06
      • 1970-01-01
      • 2015-08-21
      相关资源
      最近更新 更多