提取带音频的 MP4 文件中的 NALU

问题描述 投票:0回答:1

我正在 VB.NET 中开发一个 WinForms 应用程序,我需要解析 MP4 文件(具体来说,基于 ISO_IEC_14496-12 的 MP4 版本 1;以及 H.264/AVC 编解码器)、提取帧作为图像并存储它们。我没有为此项目使用任何 NuGet 包或外部库。

在处理不包含音频的测试视频时,我注意到从解析函数获得的 NALU 数量与帧数匹配,有时当其类型为 6 时会额外添加一个 NALU。

  1. 我最初的问题是关于这个观察:NALU 的数量是否应该等于帧数(或几乎相等)?

但是,我在处理包含音频的视频时遇到了问题。 NALUnitLength 有时会超过文件大小,或

(tempPos + NALUnitLength) > mdatEndPos
。在这种情况下,当尝试暴力破解以下 NALU时,我有时会得到无意义的结果:

  • 长度为0的NALU
  • 类型 6 的 NALU 大小异常大(超过 100,000),但文件中该位置没有任何值得注意的内容(“可读文本”)。

允许的 NALU 类型为 0 到 13、19 和 24 到 31。

不幸的是,文档没有提供有关此事的任何信息。

任何人都可以提供有关此问题的帮助或见解吗?

谢谢!

vb.net mp4 video-processing h.264
1个回答
0
投票

帧被映射到 NAL 单元,但还有可能对于解码视频数据至关重要的附加元数据。 例如 PPS、SPS 或 SEI 都是 NAL 单位。

有时,一帧会被分解为多个切片,然后每帧可以有多个视频 NAL 单元。

此外 - 隔行扫描视频可以编码为单独的场,从而每帧至少生成两个视频 NAL 单元。

简而言之 - 帧计数和 NAL 单元计数之间不存在 1:1 关系。

多个NAL单元组成一个访问单元,一个访问单元通常是一帧。

本规范详细介绍了如何将 H.264 映射到 MP4:

https://www.iso.org/standard/83336.html

此规范显示了有关 H.264 的所有详细信息:

https://www.itu.int/rec/T-REC-H.264-202108-I/en

© www.soinside.com 2019 - 2024. All rights reserved.