8
votes

Détecter les fichiers MP4

Je dois concevoir un module qui détecte les fichiers mp4 . Si vous obtiendrez un fichier aléatoire comme entrée et qu'il doit indiquer s'il s'agit d'un fichier MP4 ou non. Où puis-je trouver la spécification des en-têtes du fichier MP4? Essayé de googler mais ne pouvait rien trouver sauf la signature. Tous les autres conseils concernant la programmation C pour le module?

c mp4

0 commentaires

4 Réponses :


9
votes

Vous pouvez vérifier l'extension ou la signature du fichier ( numéro magique )

http://www.garykessler.net/library/file_sigs.html << / p>

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

00 00 00 18 66 74 79 70 33 67 70 35 .... Fichiers vidéo FTYP 3GP5 MPEG-4

ou si vous êtes sur Unix / Linux, vous pouvez analyser la sortie de fichier (1) de votre programme.

EDIT:

Vous n'avez pas besoin de numériser l'ensemble du fichier pour l'identifier, la signature fera toutefois, si vous devez, notez que MP4 est un conteneur pour d'autres formats, ce qui signifie que vous voulez Il faut probablement savoir sur MP4 et d'autres formats qu'il contient également, il y a des informations ici: http://fr.wikipedia.org/wiki/mpeg-4_part_14

J'utiliserais quelque chose comme libffmpeg pour le faire à la place.


5 commentaires

Je veux aussi des informations sur les structures internes. Est-ce documenté n'importe où?


@Parthshah Si vous souhaitez simplement détecter le fichier, vous n'avez pas besoin de la spécification complète.


Oui je sais. Mon équipe insiste sur le fait que je numérise tout le dossier! Je vais devoir le faire.


Cette séquence n'est pas toujours correcte. Ici est meilleur * * * * 66 74 79 70. * signifie qu'il peut être n'importe quoi


Références Où avez-vous eu cette information?



0
votes

C'est un format de conteneur. La spécification est ici .

Même avec la spécification à la main, vous auriez beaucoup de travail à faire pour supporter tout un conteneur pourriez-vous représenter dans votre programme; Définir des exigences réalistes.


0 commentaires

1
votes
  • Le format de fichier multimédia de base ISO est disponible gratuitement et le format de fichier MP4 est l'extension du "format de média de base", pour la plupart des cas suffisamment pour comprendre "format de média de base". Essayez que Google reviendra une norme.

  • Pour détecter si le fichier est MP4, vous devez lire les 8 premiers octets, qui contiennent (4 premiers octets la taille de l'atome et les 4 octets suivants "FTYP"). Après cela, il contient le Majorbrand et les CompatiblesBrottes - si l'un d'entre eux est ISOM, il s'agit d'un fichier MP4.So vous devez analyser que quelques octets initiaux au fichier Confiem MP4.

    Vous pouvez également consulter le code "MP4v2-1.9.1" pour comprendre le format MP4.


0 commentaires

6
votes

Lire le fichier en tant que byte [] puis analyse 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";
        }
    }


1 commentaires

Système.arraycopy ??