在DirectShow过滤器中查找hvc mp4格式的vps,sps,pps的位置?

时间:2015-07-13 13:32:57

标签: directshow mp4 hevc

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

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

1 个答案:

答案 0 :(得分:3)

无法使用directshow帮助您,但以下是使用任何十六进制编辑器在mp4文件中找到HEVC VPS,SPS和PPS数据的方法。

首先,您需要找到moov框,它位于非常接近文件的开头,或者非常接近结尾。它由4个ascii字符标识:' moov'

此后的一些字节,应该显示一个hvcC框。

此后的数据提供了有关mp4文件中hevc流的一般信息。其格式在ISO / IEC 14496-15中定义。简而言之,跳过接下来的22个字节。

Skip the marked bytes

然后,解析以下数据:

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开头。