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

126

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 se termine 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 jusqu’à ce moment-là (en fait, ils peuvent également le jouer pendant le téléchargement).

Donc, je suis intéressé, ... sans utiliser aucun moyen de téléchargement (gestionnaires de téléchargement et autres) pour sécuriser le fichier est complètement téléchargé, comment peut-on vérifier si le fichier vidéo est téléchargé en entier, et s'il est complet?

Tour
la source
MPEG incomplet devrait jouer sans problèmes. AVI a des index pour la recherche rapide à la fin du fichier, que certains lecteurs utiliseront et d’autres ne nécessiteront pas ou ne seront pas ignorés.
Bobince
7
Incomplete MPEG should play with no problems.@bobince, la question était / est de savoir comment vérifier la corruption, pas comment lire un fichier incomplet. Même si un format prend en charge la lecture de fichiers incomplets, il devrait toujours être possible de vérifier si le fichier n'est pas conforme aux spécifications de format. Par exemple, vous pouvez toujours lire un fichier de texte brut incomplet, mais vous pouvez également détecter si le fichier a des problèmes, par exemple s'il se termine au milieu d'une phrase ou s'il y a un bloc d'informations manifestement manquantes au milieu.
Synetech

Réponses:

135

Vous pouvez utiliser une fonctionnalité dans ffmpegVideo Converter: si vous indiquez 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 errorsignifie un certain niveau de verbosité (pour montrer certaines erreurs qui sont 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
Whitequark
la source
5
Même vitesse que si elle se convertissait.
Quelqu'un
8
Une autre option est ffprobefournie avec ffmpeg. Il ne fait aucune conversion mais lit simplement les informations de métadonnées à partir d'un fichier. Par conséquent, il détectera les erreurs dans les métadonnées mais ne trouvera aucun problème dans le fichier lui-même. Personnellement utilisant ffprobepour faire une vérification rapide de téléchargé avant de poursuivre le traitement
Ment
1
Cela semble durer aussi longtemps que de regarder le film, mais cela semble fonctionner
MattPark
3
Si, comme l'indique l'OP, "le téléchargement est interrompu au milieu du téléchargement ...", il est très probable que tous les flux soient perturbés. Vous pouvez donc détecter cette erreur en limitant le décodage à une seule piste audio (avec -map), ce qui accélérera considérablement le fonctionnement: en ffmpeg -v error -i in.mkv -map 0:1 -f null …cas d'erreur, il enregistrera la position de l'octet, que vous pouvez utiliser pour tronquer le fichier (un mégaoctet ou deux avant pour plus de sécurité), puis reprendre le téléchargement.
Lumi
3
Il m'a fallu peut-être 4 minutes et demie pour tester un fichier .mkv long de 1 Go sur un ancien processeur à noyau hexagonal. Tous les noyaux ont été maximisés pendant le test. J'ai modifié une copie du fichier et ajouté quelques blocs de 00 pour simuler les dommages. Le journal des erreurs a signalé les erreurs correctement. Les fichiers sans erreur ont renvoyé une erreur
vide.log
12

J'ai aimé l'idée d'utiliser ffmpeg -f nullci-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
Pfalcon
la source
1
si vous faites en sorte qu'il remplace les pièces cassées par de bonnes pièces, ce serait encore mieux
akostadinov
Je reçois une erreur en utilisant ceci:
Akshit Rewari
2
Traceback (appel le plus récent en dernier): Fichier "F: \ filecheck.py", ligne 6, dans <module> t = os.popen ('ffmpeg -v 5 -i "% s" -f null - 2> & 1' % sys.argv [1]). read () IndexError: index de liste hors limites
Akshit Rewari
1

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'.

Échantillons: checkvideo.bat checkvideo.bat *.avi

Configuration: 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 chauve-souris le chemin où vous avez décompressé ffmpeg Placez checkvideo.batun dossier inclus dans le chemin ou ajoutez son dossier à Variable d'environnement de chemin

Juan Antonio Tubío
la source
La réponse de Juan Antonio Tubío me permet de vérifier l’intégrité vidéo. Mais comment puis-je lire le fichier journal et détecter le moment où la vidéo est corrompue? Exemple de journal. [h264 @ 00000173649787c0] cabac décodage de qscale diff échoué à 64 7 [h264 @ 00000173649787c0] erreur lors du décodage de MB 64 7, flux de test 38638
J.Duck
1

Le problème avec l’autre solution ffmpegconsistant à recoder au nullformat, c’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 uniquement à la fin, cette méthode échouera.

Shivams
la source
0

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

GSpot est un autre outil, 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

Shevek
la source
1
J'ai une ancienne version de GSpot sur ma machine ... mais c'est un outil pour quelque chose de complètement différent (déterminer le code / décoder ...). Cela n'a rien à voir avec cela. Je vais vérifier mediainfo.
Rook
GSpot indiquera si la taille du fichier ou le nombre d'images ne correspond pas à l'attente de l'index (quelque part sur la gauche, cela fait longtemps que je ne l'utilise pas!). De plus, les versions ultérieures ont ajouté de nombreuses fonctionnalités.
Shevek
mediainfo peut scanner de manière récursive des répertoires: pour obtenir un rapport de tous les fichiers à n’importe quel niveau, à partir du dossier actuel, exécutez-le simplement mediainfo *.
ccpizza
1
mediainfoapparemment ne vérifie pas la complétude. J'ai pris un webmfichier vidéo de 33 Mo et je l'ai truncatecoupé à la moitié. mediainfoavait toujours presque le même résultat pour les deux, aucun signe apparent de corruption. Après avoir truncateatteint 1 Mo, il n'y avait toujours pas de signe clair de corruption dans la sortie. Seulement si vous avez regardé plus en profondeur la sortie, il y avait des informations contradictoires. Mais ces parties dépendent du format du fichier vidéo, vous ne pouvez donc pas automatiser cette détection.
Tino
3
mediainfone lit rien sauf des métadonnées. Cela ne vérifiera en aucun cas la validité de votre fichier.
DanielSmedegaardBuus