我正在 VB.NET 中开发一个 WinForms 应用程序,我需要解析 MP4 文件(具体来说,基于 ISO_IEC_14496-12 的 MP4 版本 1;以及 H.264/AVC 编解码器)、提取帧作为图像并存储它们。我没有为此项目使用任何 NuGet 包或外部库。
在处理不包含音频的测试视频时,我注意到从解析函数获得的 NALU 数量与帧数匹配,有时当其类型为 6 时会额外添加一个 NALU。
但是,我在处理包含音频的视频时遇到了问题。 NALUnitLength 有时会超过文件大小,或
(tempPos + NALUnitLength) > mdatEndPos
。在这种情况下,当尝试暴力破解以下 NALU时,我有时会得到无意义的结果:
允许的 NALU 类型为 0 到 13、19 和 24 到 31。
不幸的是,文档没有提供有关此事的任何信息。
任何人都可以提供有关此问题的帮助或见解吗?
谢谢!
帧被映射到 NAL 单元,但还有可能对于解码视频数据至关重要的附加元数据。 例如 PPS、SPS 或 SEI 都是 NAL 单位。
有时,一帧会被分解为多个切片,然后每帧可以有多个视频 NAL 单元。
此外 - 隔行扫描视频可以编码为单独的场,从而每帧至少生成两个视频 NAL 单元。
简而言之 - 帧计数和 NAL 单元计数之间不存在 1:1 关系。
多个NAL单元组成一个访问单元,一个访问单元通常是一帧。
本规范详细介绍了如何将 H.264 映射到 MP4:
https://www.iso.org/standard/83336.html
此规范显示了有关 H.264 的所有详细信息: