web-dev-qa-db-fra.com

Vérifiez rapidement l'intégrité des fichiers vidéo dans un répertoire avec ffmpeg

Je cherche désespérément une méthode pratique pour vérifier l'intégrité des fichiers .mp4 dans un répertoire spécifique contenant des dossiers. Les noms des fichiers .mp4 et des dossiers contiennent des espaces, des caractères spéciaux et des chiffres.

J'ai déjà trouvé une commande ffmpeg appropriée pour identifier rapidement un fichier .mp4 endommagé, extrait de ici : ffmpeg -v error -i filename.mp4 -map 0:1 -f null - 2>error.log

Si le fichier error.log créé contient des entrées, le fichier est évidemment corrompu. Le contraire serait un error.log vide.

L'étape suivante consiste à appliquer cette commande à chaque fichier .mp4 du dossier et de ses sous-dossiers. Certains guides, comme ici et ici , décrivent comment appliquer une commande ffmpeg de manière récursive, mais mes compétences en codage sont limitées. Par conséquent, je ne trouve pas le moyen de combiner ces commandes pour obtenir les éléments suivants. :

Une façon de tester (récursivement) tous les fichiers .mp4 dans un dossier avec la commande ffmpeg susmentionnée, qui devrait créer des fichiers .log, uniquement si un fichier vidéo contient des erreurs (read a du contenu) et qu'il doit hériter du nom du fichier brisé fichier, pour savoir quel fichier est corrompu.

Utiliser Ubuntu Gnome 15.10.

6
DMT

Essayez cette commande:

find . -name "*.mp4" -exec ffmpeg -v error -i "{}" -map 0:1 -f null - 2>error.log \;

La commande find trouve tous les fichiers du répertoire en cours qui correspondent au modèle donné: "*.mp4". Après -exec vient la commande que vous voulez exécuter pour tous les fichiers. "{}" remplace le nom du fichier actuel, où les guillemets permettent des espaces dans les noms de fichiers. La commande doit se terminer par \;

MODIFIER:

Le code ci-dessus ne génère qu'un seul fichier journal. Pour créer des fichiers .log séparés pour les fichiers .mp4 avec chacun leur nom, vous pouvez utiliser le symbole {} une fois de plus:

find . -name "*.mp4" -exec sh -c "ffmpeg -v error -i {} -map 0:1 -f null - 2>{}.log" \;
7
Andrea Dusza

J'ai récemment rencontré le même problème, mais je pense qu'il y a un simple bidouillage pour savoir quels fichiers sont cassés:

find -name "*.mp4" -exec sh -c "echo '{}' >> errors.log; ffmpeg -v error -i '{}' -map 0:1 -f null - 2>> errors.log" \;

De cette façon, les erreurs suivent le nom du fichier (et le chemin).

6
memoz

Le problème avec les autres réponses utilisant ffmpeg pour recoder au format null est qu’elles prennent beaucoup de temps. Un moyen rapide serait de générer des vignettes pour toutes les vidéos et de voir où la génération de vignettes échoue. 

find . -iname "*.mp4" | while read -r line; do 
  line=`echo "$line" | sed -r 's/^\W+//g'`; 
  echo 'HERE IT IS ==>' "$line"; 
  if ffmpeg -i "$line" -t 2 -r 0.5 %d.jpg; 
    then echo "DONE for" "$line"; 
  else echo "FAILED for" "$line" >>error.log; 
  fi; 
done;

Cette méthode s'est avérée beaucoup plus rapide que les autres méthodes. 

Cependant, il y a un CAVEAT. Cette méthode peut donner des résultats erronés, car parfois, une vignette peut être générée même pour des fichiers corrompus. Par exemple. si le fichier vidéo est corrompu seulement à la fin, cette méthode échouera.

0
shivams