web-dev-qa-db-fra.com

Toute personne familière avec la structure de données mp4?

Où dans la structure du fichier mp4 correspond à sa durée?

32
Tom Brito

Ce n'est peut-être pas la solution à votre problème, mais c'était à moi: http://mediainfo.sourceforge.net/

(Il a une bibliothèque et il est open source afin que vous puissiez simplement vérifier la ou les parties dont vous avez besoin)

13
Camilo Martin

Voir https://github.com/sannies/mp4parser project. C'est une bibliothèque Java qui montre la structure des fichiers mp4.

8
Aftershock

Pour autant que je sache, le conteneur "mp4" est dérivé de la structure d'atome de QuickTime. Vous pouvez lire la description du format de fichier QuickTime.

L'analyse des atomes quicktime n'est pas une grosse affaire (regardez projet atomicParsley ). Je ne suis pas sûr pour MP4, mais en ce qui concerne les fichiers MOV, il existe un champ "durée" dans "mvhd" (en-tête de film) et dans "tkhd" (en-tête de piste). Cette durée est généralement un nombre d'images multiplié par l'attribut "échelle de temps" . L'échelle de temps peut être trouvée dans les mêmes atomes.

6
2can

Pour le lecteur MP4 Red5, j'ai utilisé l'atome "mvhd", car il contient à la fois des champs d'échelle de temps et de durée. Obtenir la durée de l'atome sera différent en fonction de la version utilisée. Vous trouverez ci-dessous un exemple:

public long create_full_atom(MP4DataStream bitstream) throws IOException {
    long value = bitstream.readBytes(4);
    version = (int)value >> 24;
    flags = (int)value & 0xffffff;
    readed += 4;
    return readed;
}

public long create_movie_header_atom(MP4DataStream bitstream) throws IOException { create_full_atom(bitstream); if (version == 1) { creationTime = createDate(bitstream.readBytes(8)); modificationTime = createDate(bitstream.readBytes(8)); timeScale = (int)bitstream.readBytes(4); duration = bitstream.readBytes(8); readed += 28; } else { creationTime = createDate(bitstream.readBytes(4)); modificationTime = createDate(bitstream.readBytes(4)); timeScale = (int)bitstream.readBytes(4); duration = bitstream.readBytes(4); readed += 16; } int qt_preferredRate = (int)bitstream.readBytes(4); int qt_preferredVolume = (int)bitstream.readBytes(2); bitstream.skipBytes(10); long qt_matrixA = bitstream.readBytes(4); long qt_matrixB = bitstream.readBytes(4); long qt_matrixU = bitstream.readBytes(4); long qt_matrixC = bitstream.readBytes(4); long qt_matrixD = bitstream.readBytes(4); long qt_matrixV = bitstream.readBytes(4); long qt_matrixX = bitstream.readBytes(4); long qt_matrixY = bitstream.readBytes(4); long qt_matrixW = bitstream.readBytes(4); long qt_previewTime = bitstream.readBytes(4); long qt_previewDuration = bitstream.readBytes(4); long qt_posterTime = bitstream.readBytes(4); long qt_selectionTime = bitstream.readBytes(4); long qt_selectionDuration = bitstream.readBytes(4); long qt_currentTime = bitstream.readBytes(4); long nextTrackID = bitstream.readBytes(4); readed += 80;
return readed;
}


Sur une note latérale, j’ai utilisé les valeurs pour calculer le temps de lecture et la fréquence en secondes comme suit:
    double fps = (videoSampleCount * timeScale) / (double) duration;
    double videoTime = ((double) duration / (double) timeScale);
La variable videoSampleCount provient de l’atome "stsz".

6
Paul Gregoire

MP4 est un format "conteneur", ce qui signifie qu'il peut contenir un certain nombre de flux audio ou vidéo différents. Et chaque flux pourrait avoir sa propre valeur de durée ...

Pour creuser ce dont vous avez besoin, vous allez avoir besoin de plus de fichiers de référence. Je pourrais suggérer de regarder ici et ici ... mais vous devrez probablement aller au-delà de cela pour rechercher les différents types de flux A/V que vous souhaitez prendre en charge.

4
ewall

Utilisation de MP4Parser http://code.google.com/p/mp4parser/ comme mentionné précédemment - ils ont même un échantillon qui fournit une durée: 

https://mp4parser.googlecode.com/svn/trunk/examples/src/main/Java/com/googlecode/mp4parser/GetDuration.Java

1
Francis Shanahan

Fondamentalement, la structure MP4 est un arbre . Les zones macro sont:

  • ftyp - type de fichier
  • moov - contient des métadonnées (titre de la chanson, auteurs, url et autres informations)
  • free - zone vide pour séparer l'en-tête et les données
  • mdat - contient les trames audio

Vous pouvez essayer cet outil freeware MP4 Analyzer 

http://www.thinmultimedia.co.kr/products/MP4Reader_download.html

1
Lorenzo Di Ciaccio

La durée du film est dans l'en-tête du film mvhd . La durée en secondes est dérivée de deux champs dans mvhd.

  • Échelle de temps de 4 octets 
  • Durée de 4 octets

Ce sont les lignes 380 et 382 spécifiées par @Tom Brito.

Donc, étant donné l'échelle de temps 'ts' et la durée 'dur' Duration in seconds = dur / ts

0
Peter Tran