web-dev-qa-db-fra.com

Comment puis-je vérifier l'intégrité d'un fichier vidéo (avi, mpeg, mp4 ...)?

Ce titre pourrait être un peu trompeur, alors laissez-moi vous expliquer ...

Je télécharge un fichier vidéo ... MPEG, AVI - étant l'un des formats populaires. Maintenant, si je le télécharge, et que le téléchargement est interrompu au milieu du téléchargement, par exemple, Windows Media Player émettra une erreur et refusera de le lire (bien que le fichier soit, disons, Terminé à 98%). Mais des joueurs comme KMPlayer ou MediaPlayer Classic le joueront jusque-là (ils pourront même le jouer pendant le téléchargement).

Donc, ça m'intéresse, ... sans utiliser aucun moyen de téléchargement (gestionnaires de téléchargement ou autres) pour sécuriser le fichier complètement téléchargé, comment vérifier si le fichier vidéo est téléchargé en entier et s'il est complet?

120
Rook

Vous pouvez utiliser une fonctionnalité dans le convertisseur vidéo ffmpeg: si vous spécifiez de ne pas recoder la vidéo, elle lira simplement le fichier d'entrée et signalera les erreurs éventuelles. Ce processus est très rapide car les images vidéo sont en cours de lecture, de vérification et de suppression silencieuse.

Exemple de ligne de commande: (pour Linux)

ffmpeg -v error -i file.avi -f null - 2>error.log

-v error signifie un certain niveau de verbosité (pour afficher certaines erreurs normalement cachées car elles n'affectent pas beaucoup la jouabilité).

Vous obtiendrez un journal des erreurs complet contenant des informations génériques sur le fichier que ffmpeg affichera. Cela nécessitera probablement votre attention. Des filtres peuvent être écrits pour permettre la vérification par lots de fichiers similaires.

FFmpeg est également disponible pour Windows ici . La ligne de commande sera presque identique à l'exception de stderr redirect:

ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1
124
whitequark

J'aimais bien l'idée d'utiliser ffmpeg -f null ci-dessus, mais j'aimerais en fait automatiser le processus d'utilisation de cette sortie. En particulier, le scénario que j’ai couramment avec ma collection de vidéos musicales est que j’ai peu de clips qui ont la même résolution, et je voudrais comparer les journaux de vérification de ces fichiers pour supprimer ceux qui sont le plus endommagés.

Malheureusement, jusqu'à présent, ffmpeg n'a pas la possibilité de désactiver son mode interactif, qui génère du bruit pour ce cas d'utilisation. J'ai fini par pirater un script de wrapper simple pour faire du filtrage:

#!/usr/bin/env python
import sys
import os
import re

t = os.popen('ffmpeg -v 5 -i "%s" -f null - 2>&1' % sys.argv[1]).read()
t = re.sub(r"frame=.+?\r", "", t)
t = re.sub(r"\[(.+?) @ 0x.+?\]", "[\\1]", t)
print t

Exemple de sortie:

[mpeg1video]ac-tex damaged at 21 17
[mpeg1video]Warning MVs not available
[mpeg1video]concealing 22 DC, 22 AC, 22 MV errors
[mpeg1video]Warning MVs not available
[mpeg1video]concealing 22 DC, 22 AC, 22 MV errors
[mpeg1video]ac-tex damaged at 13 9
9
pfalcon

Le problème avec l’autre réponse utilisant ffmpeg pour recoder au format null est que cela prend vraiment beaucoup de temps. Surtout si vous voulez vérifier plusieurs fichiers dans un répertoire.

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.

1
shivams

Pour Windows, vous pouvez vérifier par lots l'intégrité des vidéos sur le dossier actuel et tous les sous-dossiers contenant ce fichier bat:

checkvideo.bat

@echo off

set "filtro=%1"
if [%filtro%]==[] (
    set "filtro=*.mp4"
    )

for /R %%a in (%filtro%) do call :doWork "%%a"

    PAUSE
    exit /B

:doWork
    C:\ffmpeg\bin\ffmpeg.exe -v error -i %1 -f null - > "%~1.log" 2>&1

Utilisation:

checkvideo.bat [filter]

Si vous ne donnez pas un filtre, vous obtiendrez '* .mp4'.

Exemples: checkvideo.batcheckvideo.bat *.avi

Setup: Téléchargez FFmpeg pour Windows à partir d’ici: https://ffmpeg.zeranoe.com/builds/ et décompressez-les. Modifiez C:\ffmpeg\bin\ dans le fichier bat pour le chemin où vous avez décompressé ffmpeg. Mettez checkvideo.bat sur un dossier inclus dans le chemin ou ajouter son dossier à la variable d'environnement chemin

0
Juan Antonio Tubío

MediaInfo est un excellent outil pour obtenir des informations sur tous les fichiers vidéo que vous souhaitez importer. Cela peut être en mesure de mettre en évidence les informations souhaitées.

Un autre outil est GSpot mais il n’a pas été mis à jour depuis 2007.

Essayez de donner à chacun un mauvais fichier connu et comparez les résultats.

J'avais l'habitude d'utiliser GSpot jusqu'à ce qu'il cesse d'être mis à jour, puis je suis passé à MediaInfo

0
Shevek