8

我必须设计一个检测mp4文件的模块。如果将获得任何随机文件作为输入,它必须判断它是否是 mp4 文件。在哪里可以找到 mp4 文件的标头规范?尝试谷歌搜索,但除了签名之外找不到任何东西。有关该模块的 C 编程的任何其他提示?

4

4 回答 4

10

您可以检查扩展名或文件签名(幻数

http://www.garykessler.net/library/file_sigs.html

http://en.wikipedia.org/wiki/List_of_file_signatures

00 00 00 18 66 74 79 70 33 67 70 35 ....ftyp 3gp5 MPEG-4 视频文件

或者,如果你在 Unix/Linux 上,你可以从你的程序中解析file(1)的输出。

编辑:

您不需要扫描整个文件来识别它,签名就可以,但是,如果必须,请注意 MP4 是其他格式的容器,这意味着您可能需要了解 MP4 和其他格式也包含,这里有一些信息: http ://en.wikipedia.org/wiki/MPEG-4_Part_14

我会使用libffmpeg 之类的东西来代替。

于 2012-11-02T05:52:25.637 回答
6

将文件读取为 byte[] 然后解析 mime。

byte[] header = new byte[20];
    System.arraycopy(fileBytes, 0, header, 0, Math.min(fileBytes.length, header.length));

    int c1 = header[0] & 0xff;
    int c2 = header[1] & 0xff;
    int c3 = header[2] & 0xff;
    int c4 = header[3] & 0xff;
    int c5 = header[4] & 0xff;
    int c6 = header[5] & 0xff;
    int c7 = header[6] & 0xff;
    int c8 = header[7] & 0xff;
    int c9 = header[8] & 0xff;
    int c10 = header[9] & 0xff;
    int c11 = header[10] & 0xff;
    int c12 = header[11] & 0xff;
    int c13 = header[12] & 0xff;
    int c14 = header[13] & 0xff;
    int c15 = header[14] & 0xff;
    int c16 = header[15] & 0xff;
    int c17 = header[16] & 0xff;
    int c18 = header[17] & 0xff;
    int c19 = header[18] & 0xff;
    int c20 = header[19] & 0xff;

if(c1 == 0x00 && c2 == 0x00 && c3 == 0x00)//c4 == 0x20 0x18 0x14
    {
        if(c5 == 0x66 && c6 == 0x74 && c7 == 0x79 && c8 == 0x70)//ftyp
        {
            if(c9 == 0x69 && c10 == 0x73 && c11 == 0x6F && c12 == 0x6D)//isom
                return "video/mp4";

            if(c9 == 0x4D && c10 == 0x53 && c11 == 0x4E && c12 == 0x56)//MSNV
                return "video/mp4";

            if(c9 == 0x6D && c10 == 0x70 && c11 == 0x34 && c12 == 0x32)//mp42
                return "video/m4v";

            if(c9 == 0x4D && c10 == 0x34 && c11 == 0x56 && c12 == 0x20)//M4V
                return "video/m4v"; //flv-m4v

            if(c9 == 0x71 && c10 == 0x74 && c11 == 0x20 && c12 == 0x20)//qt
                return "video/mov";

            if(c9 == 0x33 && c10 == 0x67 && c11 == 0x70 && c17 != 0x69 && c18 != 0x73)
                return "video/3gp";//3GG, 3GP, 3G2
        }

        if(c5 == 0x6D && c6 == 0x6F && c7 == 0x6F && c8 == 0x76)//MOOV
        {
            return "video/mov";
        }
    }
于 2020-01-08T12:29:26.953 回答
1
  • ISO 基本媒体文件格式是免费提供的,MP4 文件格式是“基本媒体格式”的扩展,在大多数情况下,它足以理解“基本媒体格式”。尝试谷歌将返回一个标准。

  • 要检测文件是否为 MP4,您需要读取前 8 个字节,其中包含(前 4 个字节为 ATOM 的大小,接下来的 4 个字节为“FTYP”)。之后它包含majorbrand 和 compatiblebrans - 如果它们中的任何一个是ISOM,它肯定是一个MP4 文件。所以你只需要解析最初的几个字节来确认MP4 文件。

您还可以查看“mp4v2-1.9.1”代码以了解 MP4 格式。

于 2012-11-13T05:31:25.857 回答
0

这是一种容器格式。规范在这里

即使有了规范,你也需要做很多工作来支持容器在你的程序中可以代表的所有内容。设定切合实际的要求。

于 2012-11-02T06:11:37.583 回答