2010-01-25 12:54:46 +0000 2010-01-25 12:54:46 +0000
130
130

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

Ce titre pourrait être quelque 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 s'interrompt au milieu du téléchargement … alors, par exemple, Windows Media Player affichera une erreur et refusera de le lire (bien que le fichier soit, disons, complet à 98%). Mais les lecteurs comme KMPlayer ou MediaPlayer Classic le joueront jusqu'à ce moment (en fait, ils peuvent aussi 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 téléchargement du fichier, comment peut-on vérifier si le fichier vidéo est téléchargé en entier, et qu'il est complet ?

Réponses (7)

137
137
137
2010-01-25 13:05:22 +0000

Vous pouvez utiliser une fonctionnalité du convertisseur ffmpeg video : si vous lui indiquez de recoder la vidéo à zéro, il se contentera de lire le fichier d'entrée et de signaler les erreurs qui apparaîtront. Ce processus est très rapide car les images vidéo sont simplement lues, vérifiées et supprimées en silence.

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 montrer certaines erreurs qui sont normalement cachées parce qu'elles n'affectent pas beaucoup la lecture).

Vous obtiendrez un journal d'erreurs complet avec quelques informations génériques sur le fichier que ffmpeg produira, ce qui nécessitera probablement votre attention, car des filtres peuvent être écrits pour effectuer une vérification par lots de fichiers similaires.

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

ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1
14
14
14
2011-09-22 17:05:59 +0000

J'ai aimé 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 commun que j'ai avec ma collection de vidéoclips est que j'ai peu de clips qui ont la même résolution, et j'aimerais différé les journaux de vérification pour ces fichiers afin de supprimer ceux qui sont le plus cassés.

Malheureusement, ffmpeg n'a jusqu'à présent aucun moyen de désactiver son mode interactif, qui produit du bruit pour ce cas d'utilisation. J'ai fini par pirater un simple script de wrapper 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
1
1
1
2017-08-15 14:13:33 +0000

Pour Windows, vous pouvez vérifier par “lot” l'intégrité des vidéos du dossier en cours et de tous les sous-dossiers avec 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

Utilisez:

checkvideo.bat [filter]

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

Échantillons : checkvideo.batcheckvideo.bat *.avi

Setup: Téléchargez FFmpeg pour Windows à partir d'ici : https://ffmpeg.zeranoe.com/builds/ et dézippez-les Changez `C:\ffmpeg\binPour Windows, vous pouvez vérifier par “lot” l'intégrité des vidéos du dossier en cours et de tous les sous-dossiers avec 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

Utilisez:

checkvideo.bat [filter]

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

Échantillons : checkvideo.batcheckvideo.bat *.avi

Setup: Téléchargez FFmpeg pour Windows à partir d'ici : [ https://ffmpeg.zeranoe.com/builds/ ]0x3& et dézippez-les Changez dans le fichier bat pour le chemin où vous avez dézippé ffmpeg Mettez checkvideo.bat sur un dossier inclus dans le Path ou ajoutez son dossier à la variable d'environnement Path

0
0
0
2020-01-12 11:14:29 +0000

fluent-ffmpeg

var ffmpeg = require('fluent-ffmpeg');
var ff = new ffmpeg();

ff.on('start', function(commandLine) {
  // on start, you can verify the command line to be used
})
.on('progress', function(data) {
  // do something with progress data if you like
})
.on('end', function() {
  // do something when complete
})
.on('error', function(err, stdout, stderr) {
  // handle error conditions
  console.log('Error: ' + err.message)
  console.log('ffmpeg output:\n' + stdout)
  console.log('ffmpeg stderr:\n' + stderr)
})
.addInput('path\to\file')
.addInputOption('-xerror')
.addInputOption('-v error')
.output('-')
.outputOptions('-f null')
.run();

Référence: https://stackoverflow.com/questions/43349360/how-to-check-for-corrupted-webm-video-using-node-js-and-fluent-ffmpeg

0
0
0
2019-11-12 09:31:47 +0000

Version simplifiée

for file in *.mp4; do ffmpeg -v error -i "$file" -f null - >error.log 2>&1; print "$file"; done

Cela permet d'imprimer le nom du fichier au fur et à mesure de son traitement.

error.log contiendra les erreurs.

0
0
0
2010-01-25 13:13:15 +0000

MediaInfo est un excellent outil pour obtenir des informations sur n'importe quel fichier vidéo que vous souhaitez lui lancer. Il peut mettre en évidence les informations que vous souhaitez.

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

Essayez de donner à chacun un bon et 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
0
0
2018-04-11 12:16:24 +0000

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.

Cependant, il y a une CAVEAT. Cette méthode peut donner des résultats erronés, car il arrive que des vignettes soient générées même pour les fichiers corrompus. Par exemple, si le fichier vidéo n'est corrompu qu'à la fin, cette méthode échouera.