我已经成功地使用 ffmpeg 创建了 Hevc/mp4 比特流。但是在十六进制编辑器中分析后,我无法在 mp4 文件中找到 VPS、SPS、PPS 数据。
然后我使用了 LAV 拆分器并检查了拆分器的输出,但它发送的是第一帧的数据而不是 VPS/SPS/PPS 数据。即使我已经通过这个链接但没有得到任何东西。那么在 DirectShow 过滤器中哪里可以找到 Hevc/mp4 格式的 VPS、SPS、PPS 呢?
我已经成功地使用 ffmpeg 创建了 Hevc/mp4 比特流。但是在十六进制编辑器中分析后,我无法在 mp4 文件中找到 VPS、SPS、PPS 数据。
然后我使用了 LAV 拆分器并检查了拆分器的输出,但它发送的是第一帧的数据而不是 VPS/SPS/PPS 数据。即使我已经通过这个链接但没有得到任何东西。那么在 DirectShow 过滤器中哪里可以找到 Hevc/mp4 格式的 VPS、SPS、PPS 呢?
无法帮助您使用 directshow,但您可以使用任何十六进制编辑器在 mp4 文件中查找 HEVC VPS、SPS 和 PPS 数据。
首先,您需要找到 moov 框,它要么非常靠近文件的开头,要么非常靠近结尾。它由 4 个 ascii 字符标识:'moov'
在此之后的一些字节,应指示一个 hvcC 框。
之后的数据提供了有关 mp4 文件中 hevc 流的一般信息。其格式在 ISO/IEC 14496-15 中定义。简而言之,跳过接下来的 22 个字节。
然后,像这样解析以下数据:
unsigned int(8) numOfArrays;
for (j=0; j < numOfArrays; j++) {
bit(1) array_completeness;
unsigned int(1) reserved = 0;
unsigned int(6) NAL_unit_type;
unsigned int(16) numNalus;
for (i=0; i< numNalus; i++) {
unsigned int(16) nalUnitLength;
bit(8*nalUnitLength) nalUnit;
}
}
然后每个阵列对应于一种类型的一组NAL单元,例如一组SPS。对于 VPS、SPS 和 PPS,您需要 NAL_unit_type 分别等于 32、33 和 34 的数组。
在我用作示例的内容中,您已经可以看到有 4 个数组可用。第一个数组是一组 NAL 单元,NAL_unit_type=32(=0x20),所以是 SPS。仅存在一个 SPS,其长度为 0x0018=24 字节。SPS 数据以 0x40010C01 开头。