Wie kann ich die Integrität einer Videodatei (avi, mpeg, mp4…) überprüfen?

126

Dieser Titel könnte etwas irreführend sein, also lassen Sie mich erklären ...

Ich lade eine Videodatei herunter ... mpeg, avi - eines der beliebtesten Formate. Wenn ich es jetzt herunterlade und der Download mitten im uhm ... -Download abbricht, gibt Windows Media Player beispielsweise einen Fehler aus und verweigert die Wiedergabe (obwohl die Datei beispielsweise 98% abgeschlossen). Spieler wie KMPlayer oder MediaPlayer Classic spielen es jedoch bis zu diesem Zeitpunkt ab (tatsächlich können sie es auch abspielen, während es heruntergeladen wird).

Also, ich bin interessiert, ... ohne irgendwelche Download-Mittel (Download-Manager und Ähnliches) zu verwenden, um sicherzustellen, dass die Datei vollständig heruntergeladen wurde. Wie kann man überprüfen, ob die Videodatei vollständig heruntergeladen wurde und ob sie vollständig ist?

Turm
quelle
Unvollständiges MPEG sollte ohne Probleme abgespielt werden. AVI verfügt über Indizes für die schnelle Suche am Ende der Datei, die einige Player verwenden und andere nicht benötigen oder ignorieren.
Bobince
7
Incomplete MPEG should play with no problems.@ Bobince, die Frage war / ist, wie man auf Korruption prüft und nicht, wie man eine unvollständige Datei abspielt. Auch wenn ein Format die Wiedergabe unvollständiger Dateien unterstützt, sollte es dennoch möglich sein, auf Beschädigungen zu prüfen, wenn die Datei nicht den Formatspezifikationen entspricht. Beispielsweise können Sie eine unvollständige Nur-Text-Datei weiterhin lesen, aber Sie können weiterhin feststellen, ob die Datei Probleme aufweist, z. B. wenn sie in der Mitte eines Satzes endet oder ein Teil offensichtlich fehlender Informationen in der Mitte vorhanden ist.
Synetech

Antworten:

135

Sie können eine Funktion in ffmpegVideo Converter verwenden: Wenn Sie festlegen, dass Videos in nichts umgewandelt werden sollen, werden nur die Eingabedateien gelesen und alle auftretenden Fehler gemeldet. Dies ist ein sehr schneller Vorgang, da Videobilder nur gelesen, geprüft und unbemerkt abgelegt werden.

Beispiel Befehlszeile: (für Linux)

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

-v errorbedeutet ein gewisses Maß an Ausführlichkeit (um einige Fehler anzuzeigen, die normalerweise verborgen sind, weil sie die Spielbarkeit nicht wesentlich beeinträchtigen).

Sie erhalten ein vollständiges Fehlerprotokoll, in dem einige allgemeine Informationen zur Datei ffmpeg ausgegeben werden. Dies erfordert möglicherweise Ihre Aufmerksamkeit, da Filter geschrieben werden können, um eine Stapelprüfung ähnlicher Dateien durchzuführen.

FFmpeg ist auch für Windows verfügbar hier . Die Befehlszeile ist mit Ausnahme von stderr redirect fast identisch:

ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1
Whitequark
quelle
5
Gleiche Geschwindigkeit wie beim Konvertieren.
Jemand
8
Eine andere Option ist, ffprobedass im Paket mit kommt ffmpeg. Es führt keine Konvertierung durch, sondern liest einfach Metadateninformationen aus der Datei. Daher erkennt es Fehler in Metadaten, findet jedoch keine Probleme in der Datei selbst. Persönlich verwendet ffprobe, um eine schnelle Überprüfung des Uploads vor der weiteren Verarbeitung durchzuführen
mente
1
Scheint ungefähr so ​​lange zu dauern, wie der Film
angeschaut
3
Wenn, wie im OP angegeben, "der Download in der Mitte des uhm ... -Downloads unterbrochen wird ", werden mit hoher Wahrscheinlichkeit alle Streams unterbrochen, sodass Sie diesen Fehler erkennen können, indem Sie die Dekodierung auf nur eine Audiospur beschränken (mithilfe von -map). Dies beschleunigt den Vorgang erheblich: ffmpeg -v error -i in.mkv -map 0:1 -f null …Wenn ein Fehler auftritt, wird die Byte-Position protokolliert, anhand derer Sie die Datei abschneiden können (ein oder zwei Megabyte früher, um sicherzugehen) und dann den Download fortsetzen.
Lumi
3
Es hat vielleicht 4 1/2 Minuten gedauert, bis ich eine 1 GB 1 Stunde lange .mkv-Datei auf einem veralteten Hex-Core-Prozessor getestet habe. Alle Kerne wurden während des Tests maximal. Ich habe eine Kopie der Datei hexadezimal bearbeitet und einige Blöcke mit 00 hinzugefügt, um den Schaden zu simulieren. Das Fehlerprotokoll hat die Fehler korrekt gemeldet. Dateien ohne Fehler haben ein leeres error.log zurückgegeben
TripleAntigen
12

Ich mochte die Idee, ffmpeg -f nullobiges zu verwenden, aber ich möchte eigentlich den Prozess der Verwendung dieser Ausgabe automatisieren. Ein häufiges Szenario für meine Musikvideosammlung ist, dass ich nur wenige Clips mit derselben Auflösung habe und ich möchte die Überprüfungsprotokolle für diese Dateien unterscheiden, um diejenigen zu entfernen, die am häufigsten beschädigt werden.

Leider hat ffmpeg bisher keine Möglichkeit, den interaktiven Modus zu deaktivieren, der für diesen Anwendungsfall Rauschen ausgibt. Am Ende habe ich ein einfaches Wrapper-Skript gehackt, um zu filtern:

#!/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

Beispielausgabe:

[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
quelle
1
Wenn Sie es so machen, dass es defekte Teile durch gute Teile ersetzt, wäre das noch besser
akostadinov
Ich
erhalte
2
Traceback (letzter Aufruf zuletzt): Datei "F: \ filecheck.py", Zeile 6, in <Modul> t = os.popen ('ffmpeg -v 5 -i "% s" -f null - 2> & 1' % sys.argv [1]). read () IndexError: Index außerhalb des
gültigen
1

Unter Windows können Sie die Integrität für Videos im aktuellen Ordner und in allen Unterordnern mit dieser Fledermausdatei stapelweise überprüfen:

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

Verwenden:

checkvideo.bat [filter]

Wenn Sie keinen Filter angeben, wird "* .mp4" angezeigt.

Proben: checkvideo.bat checkvideo.bat *.avi

Setup: Laden Sie FFmpeg für Windows von hier herunter: https://ffmpeg.zeranoe.com/builds/ und entpacken Sie sie. Ändern Sie C:\ffmpeg\bin\in der bat-Datei den Pfad, in den Sie ffmpeg entpackt haben. Legen Sie checkvideo.bateinen Ordner im Pfad an oder fügen Sie seinen Ordner hinzu Pfadumgebungsvariable

Juan Antonio Tubío
quelle
Die Antwort von Juan Antonio Tubío arbeitet für mich, um die Integrität des Videos zu überprüfen. Aber wie kann ich eine Protokolldatei lesen und feststellen, wann das Video beschädigt ist? Log Beispiel. [h264 @ 00000173649787c0] cabac-Dekodierung von qscale diff schlug bei 64 7 fehl [h264 @ 00000173649787c0] Fehler beim Dekodieren von MB 64 7, bytestream 38638
J.Duck
1

Das Problem mit der anderen Antwort ffmpegbeim Umcodieren in das nullFormat ist, dass es sehr lange dauert. Insbesondere, wenn Sie mehrere Dateien in einem Verzeichnis prüfen möchten.

Eine schnelle Möglichkeit wäre, Miniaturansichten für alle Videos zu generieren und festzustellen, wo die Erzeugung der Miniaturansichten fehlschlägt.

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;

Diese Methode erwies sich als viel SCHNELLER als andere Methoden.

Es gibt jedoch eine CAVEAT. Diese Methode kann zu falschen Ergebnissen führen, da manchmal sogar für beschädigte Dateien Miniaturansichten erstellt werden können. Wenn beispielsweise die Videodatei nur am Ende beschädigt ist, schlägt diese Methode fehl.

shivams
quelle
0

MediaInfo ist ein großartiges Tool, mit dem Sie Informationen zu allen Videodateien abrufen können, die Sie darauf werfen möchten . Dies kann möglicherweise die gewünschten Informationen hervorheben.

Ein weiteres Tool ist GSpot , das seit 2007 nicht mehr aktualisiert wurde.

Versuchen Sie, jedem eine als gut und als schlecht bekannte Datei zuzuweisen, und vergleichen Sie die Ergebnisse.

Ich habe GSpot verwendet, bis es nicht mehr aktualisiert wurde, und dann zu MediaInfo gewechselt

Shevek
quelle
1
Ich habe eine alte Version von GSpot auf meinem Computer ... aber es ist ein Tool für etwas völlig anderes (Ermitteln des Codes / Dekodierens ...). Das hat nichts damit zu tun. Ich werde mediainfo überprüfen.
Turm
GSpot meldet, wenn die Dateigröße oder die Anzahl der Frames nicht den vom Index erwarteten Werten entspricht (irgendwo auf der linken Seite ist es schon eine Weile her, dass ich sie verwendet habe!). Auch spätere Versionen fügten viel Funktionalität hinzu.
Shevek
mediainfo kann Verzeichnisse rekursiv scannen: Um einen Bericht aller Dateien auf jeder Ebene zu erhalten, beginnend mit dem aktuellen Ordner, führen Sie einfach aus mediainfo *.
ccpizza
1
mediainfoprüft offenbar nicht auf Vollständigkeit. Ich habe eine 33 MB große webmVideodatei genommen und truncatesie zur Hälfte zerlegt. mediainfohatte immer noch fast die gleiche Ausgabe für beide, kein offensichtliches Zeichen von Korruption. Nach dem truncateErreichen von 1 MB gab es noch keine eindeutigen Anzeichen für eine Beschädigung der Ausgabe. Nur wenn man sich die Ausgabe genauer ansieht, gibt es widersprüchliche Informationen. Diese Teile hängen jedoch vom Format der Videodatei ab, sodass Sie diese Erkennung nicht automatisieren können.
Tino
3
mediainfoliest nichts als Metadaten. Dadurch wird die Gültigkeit Ihrer Datei in keiner Weise überprüft.
DanielSmedegaardBuus