8 votes

Comment valider un fichier vidéo à partir d'un script ?

J'ai un serveur avec beaucoup de fichiers vidéo. Après une restauration, j'ai remarqué que la somme de contrôle de quelques fichiers avait changé. Comme je n'ai pas de sommes de contrôle pour tous les fichiers, j'ai voulu écrire un script pour vérifier l'intégrité des fichiers. C'est simple pour les archives ( tar t , unzip -t , rar t etc.) ou des images ( convert image.jpg /tmp/test.png ).

Quelles options dois-je passer à mplayer ou vlc ou tout autre outil vidéo sous Linux pour obtenir le même effet (c'est-à-dire valider le contenu du fichier sans avoir à regarder toute la vidéo) ?

6voto

slacy Points 4417

On dirait que ce que tu veux faire, c'est.. :

mplayer -vo null -ao null input.file

et ensuite analyser la sortie et la valeur de retour pour voir s'il peut effectivement lire et décoder le flux. Cela prendra un certain temps (mais sera plus rapide que le temps réel). Si vous voulez quelque chose d'encore plus rapide, voici d'autres suggestions :

Une chose facile va être de faire un

mplayer -identify -vo null -ao null

sur le fichier, et ensuite analyser la sortie et regarder la valeur de retour pour quelque chose qui semble raisonnable.

En ce qui concerne les sommes de contrôle incorrectes, il va être difficile de savoir si c'est un problème pour votre lecteur multimédia ou non (mplayer, vlc, totem, etc.). Un bon lecteur multimédia tolérera de nombreuses erreurs au niveau du bit ou de l'octet avec un faible impact sur la lecture. Un lecteur multimédia très strict quittera le système lorsqu'il verra des octets de codec et de wrapper malformés ou incorrects.

Pour vérifier les octets du wrapper (conteneur), vous pourriez faire quelque chose comme

mencoder -ovc copy -oac copy input.file -o output.file

Le problème est que mencoder voudra créer un fichier .avi en sortie. Si vos entrées sont des .avi, alors cela fonctionnera parfaitement.

Vous pouvez exécuter une ligne de commande ffmpeg similaire, comme ceci :

ffmpeg -acodec copy -vcodec copy input.file output.file

Si les fichiers sont des fichiers .mp4, vous pouvez jeter un coup d'œil à mp4box ( http://www.videohelp.com/tools/mp4box ) pour effectuer une tâche similaire. Les outils matroska sont également bons pour ce genre de choses. ( http://www.matroska.org/ )

2voto

Stu Thompson Points 16599

Si vous travaillez avec des fichiers MP4, vous voudrez peut-être jeter un coup d'œil à l'application mpeg4ip et plus particulièrement les outils tels que mp4videoinfo ou mp4info . Cela peut suffire à répondre à vos besoins, et c'est très rapide.

De la première page :

  • mp4dump Utilitaire de vidage des méta-informations du fichier MP4 sous forme de texte
  • mp4trackdump Utilitaire permettant d'extraire les informations sur les pistes des fichiers MP4 sous forme de texte
  • mp4info Utilitaire pour afficher le résumé du fichier MP4
  • mp4videoinfo Utilitaire permettant de récupérer des informations sur les pistes vidéo des fichiers MP4
  • avidump Utilitaire pour afficher le résumé d'un fichier AVI
  • yuvdump Utilitaire pour afficher un fichier vidéo brut à l'écran
  • mpeg_ps_info Utilitaire pour afficher les flux d'un programme mpeg ou d'un fichier vob
  • mpeg_ps_extract Utilitaire pour extraire les flux élémentaires d'un programme mpeg ou d'un fichier vob.

Voici un exemple de sortie d'un MP4 pris sur mon Nokia N95 :

manoa:Movies stu$ mp4info 20081017001.mp4 
mp4info version 1.5.0.1
20081017001.mp4:
Track   Type    Info
1   video   MPEG-4 Unknown Profile(4), 3.620 secs, 2700 kbps, 640x480 @ 23.480663 fps
2   audio   MPEG-4 AAC LC, 3.797 secs, 97 kbps, 48000 Hz
manoa:Movies stu$ 
manoa:Movies stu$ 
manoa:Movies stu$ mp4videoinfo 20081017001.mp4
mp4videoinfo version 1.5.0.1
tracks 1
mp4file 20081017001.mp4, track 1, samples 85, timescale 30000
sampleId      1, size 24110 time 0(0) VOP-I
sampleId      2, size  9306 time 4076(135) VOP-P
sampleId      3, size 13071 time 5104(170) VOP-P
... (a bunch more frames and a bit of info)  ...
sampleId     59, size  8702 time 64975(2165) VOP-P
sampleId     60, size  8826 time 65980(2199) VOP-P
sampleId     61, size  9819 time 66966(2232) GOV VOP-I
sampleId     62, size  5591 time 67986(2266) VOP-P
... (a bunch more frames and a bit of info)  ...
sampleId     83, size 10188 time 105546(3518) VOP-P
sampleId     84, size  6533 time 106585(3552) VOP-P
sampleId     85, size  6032 time 107601(3586) VOP-P
manoa:Movies stu$

2voto

dbr Points 66401

À moins de regarder toutes les vidéos, il n'y a pas de méthode "parfaite" pour faire cela.

Les fichiers vidéo sont assez robustes - à titre expérimental, j'ai pris un fichier vidéo MPEG-4 au hasard, je l'ai ouvert dans un éditeur hexadécimal et j'ai commencé à modifier les octets mplayer et Quicktime l'a lu sans erreur.

J'ai dû supprimer des milliers d'octets avant d'obtenir une erreur de mplayer :

...
[mpeg4 @ 0x6762b0]marker does not match f_code
[mpeg4 @ 0x6762b0]marker does not match f_code
[mpeg4 @ 0x6762b0]concealing 852 DC, 852 AC, 852 MV errors
[mpeg4 @ 0x6762b0]header damaged:  0.055  16/ 16 15%  1%  3.5% 0 0 
Error while decoding frame!

Il ne serait pas difficile d'écrire un script qui exécute mplayer sur chaque vidéo, et vérifie la sortie pour les messages d'erreur ou les avertissements, mais à moins que les octets modifiés soient dans l'en-tête du fichier, ou que beaucoup de données aient été modifiées, vous ne les trouverez jamais tous.

1voto

lothar Points 11904

Comme mplayer a des options pour convertir d'un format vidéo à un autre qui pourrait être suffisant pour un tel test en supposant que mencoder renvoie une erreur s'il ne peut pas décoder le fichier d'entrée (je n'ai pas testé cela). Cela fonctionnerait de manière similaire à la méthode test d'image vous avez mentionné (convertir image.jpg /tmp/test.png)

-1voto

dicroce Points 11988

Je vous recommande d'utiliser sha1sum, un outil en ligne de commande que vous avez probablement déjà (et si non, vous avez probablement aussi md5sum, qui serait parfait pour ce travail)... Tout ce que vous avez à faire est de comparer le stdout de sha1sum avant et après la restauration...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X