Où dans la structure du fichier mp4 correspond à sa durée?
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)
Voir https://github.com/sannies/mp4parser project. C'est une bibliothèque Java qui montre la structure des fichiers mp4.
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.
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:
La variable videoSampleCount provient de l’atome "stsz".
double fps = (videoSampleCount * timeScale) / (double) duration;
double videoTime = ((double) duration / (double) timeScale);
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.
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:
Fondamentalement, la structure MP4 est un arbre . Les zones macro sont:
Vous pouvez essayer cet outil freeware MP4 Analyzer
http://www.thinmultimedia.co.kr/products/MP4Reader_download.html
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.
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