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 .... ftyp3gp5MPEG-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とcompatibilitybransが含まれます-どちらかがISOMの場合、それは間違いなくMP4ファイルです。したがって、MP4ファイルを確認するには、最初の数バイトのみを解析する必要があります。

「mp4v2-1.9.1」コードを見て、MP4形式を理解することもできます。

于 2012-11-13T05:31:25.857 に答える
0

コンテナ形式です。仕様はこちらです。

仕様が手元にある場合でも、プログラムでコンテナが表すことができるすべてのコンテナをサポートするには、多くの作業が必要になります。現実的な要件を設定します。

于 2012-11-02T06:11:37.583 に答える