0

我已经成功地使用 ffmpeg 创建了 Hevc/mp4 比特流。但是在十六进制编辑器中分析后,我无法在 mp4 文件中找到 VPS、SPS、PPS 数据。

然后我使用了 LAV 拆分器并检查了拆分器的输出,但它发送的是第一帧的数据而不是 VPS/SPS/PPS 数据。即使我已经通过这个链接但没有得到任何东西。那么在 DirectShow 过滤器中哪里可以找到 Hevc/mp4 格式的 VPS、SPS、PPS 呢?

4

1 回答 1

3

无法帮助您使用 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 开头。

于 2015-07-14T09:34:21.890 回答