it-swarm.com.de

Überprüfen Sie schnell die Integrität von Videodateien in einem Verzeichnis mit ffmpeg

Ich suche verzweifelt nach einer geeigneten Methode, um die Integrität von .mp4-Dateien in einem bestimmten Verzeichnis mit Ordnern zu überprüfen. Sowohl die Namen der .mp4-Dateien als auch die Ordner enthalten Leerzeichen, Sonderzeichen und Zahlen.

Ich habe bereits einen richtigen ffmpeg-Befehl gefunden, um eine beschädigte .mp4-Datei schnell zu identifizieren, aus hier : ffmpeg -v error -i filename.mp4 -map 0:1 -f null - 2>error.log

Wenn das erstellte error.log einige Einträge enthält, ist die Datei offensichtlich beschädigt. Das Gegenteil wäre ein leeres error.log.

Der nächste Schritt wäre, diesen Befehl auf jede .mp4-Datei innerhalb des Ordners und seiner Unterordner anzuwenden. Einige Handbücher, wie hier und hier , beschreiben, wie ein Befehl ffmpeg rekursiv angewendet wird, aber meine Programmierkenntnisse sind begrenzt, daher kann ich keine Möglichkeit finden, diese Befehle zu kombinieren um folgendes zu bekommen:

Eine Möglichkeit, alle .mp4-Dateien innerhalb eines Ordners (rekursiv) mit dem zuvor genannten Befehl ffmpeg zu testen, der .log-Dateien nur dann erstellt, wenn eine Videodatei Fehler enthält (read hat Inhalt) und den Namen des defekten erben soll Datei, um zu wissen, welche Datei beschädigt ist.

Ubuntu Gnome verwenden 15.10.

6
DMT

Versuchen Sie diesen Befehl:

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

Der Befehl find sucht rekursiv alle Dateien im aktuellen Verzeichnis, die dem angegebenen Muster entsprechen: "*.mp4". Nach -exec folgt der Befehl, den Sie für alle Dateien ausführen möchten. "{}" ersetzt den Namen der aktuellen Datei, wobei die Anführungszeichen Leerzeichen in Dateinamen zulassen. Der Befehl muss mit \; enden. 

BEARBEITEN:

Der obige Code generiert insgesamt nur eine Protokolldatei. Um separate .log-Dateien für die .mp4-Dateien mit jeweils ihrem Namen zu erstellen, können Sie das {}-Symbol noch einmal verwenden:

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

Ich habe kürzlich das gleiche Problem gefunden, aber ich denke, es gibt einen einfachen Hack, um herauszufinden, welche Dateien defekt sind:

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

Auf diese Weise folgen die Fehler dem Dateinamen (und Pfad).

6
memoz

Bei den anderen Antworten, die ffmpeg verwenden, um in null-Format umzuwandeln, besteht das Problem darin, dass sie sehr lange dauern. Eine schnelle Möglichkeit wäre, Miniaturansichten für alle Videos zu erstellen und zu sehen, wo die Erzeugung von 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 ein CAVEAT. Diese Methode kann zu falschen Ergebnissen führen, da manchmal sogar für beschädigte Dateien ein Miniaturbild erzeugt werden kann. Z.B. Wenn die Videodatei nur am Ende beschädigt ist, schlägt diese Methode fehl.

0
shivams