Wie überprüfe ich, ob ein Video vollständig heruntergeladen wurde?

9

Ich habe eine Reihe von Videos, die ich überprüfen möchte, ob sie vollständig sind oder nicht. Einige von ihnen können teilweise heruntergeladen werden, aber sie sind nicht fehlerhaft. Wie kann ich effizient überprüfen, ob diese Videos vollständig heruntergeladen wurden?

Wenn ich die Links hätte, hätte ich die Größe überprüft, aber ich nicht.

Ich habe versucht, ffprobeund zu verwenden mediainfo. ffprobemeldet kleinere Probleme bei teilweise heruntergeladenen Dateien, meldet jedoch auch ähnliche Probleme bei einigen vollständig heruntergeladenen Dateien. Soll ich ffmpegdie gesamten Dateien lesen und die Länge der Videos vergleichen, um zu überprüfen, ob sie heruntergeladen wurden? Gibt es eine bessere Lösung?

Ho1
quelle
Sprechen Sie über Dateien, die gerade heruntergeladen werden, dh das Programm, das sie herunterlädt, schreibt immer noch in die Datei, wenn es mehr Daten empfängt? Oder sprechen Sie von Dateien, deren Download in der Vergangenheit abgebrochen wurde?
Gilles 'SO - hör auf böse zu sein'
@ Gilles Die wurden in der Vergangenheit heruntergeladen, und jetzt sind einige dieser Dateien unvollständig. Ich möchte unvollständige Videodateien finden, damit ich die Links manuell finden und den Download fortsetzen kann.
Ho1
@ Ho1 hat meine Antwort Ihre Frage befriedigt?
J363
@ J363 Danke für deine Antwort. Könnten Sie bitte auf meinen Kommentar antworten?
Ho1

Antworten:

11

ffmpegist ein betriebssystemunabhängiges Tool, mit dem festgestellt werden kann, ob eine Videodatei vollständig heruntergeladen wurde. Der folgende Befehl weist Sie ffmpegan, das Eingangsvideo zu lesen und das Video in nichts zu codieren. Während des Codierungsprozesses werden Fehler wie fehlende Frames in test.log ausgegeben.

ffmpeg -v error -i FILENAME.mp4 -f null - 2>test.log

Wenn eine Videodatei nicht vollständig heruntergeladen wurde, enthält die Datei test.log viele Zeilen. Beispielsweise verursachte das Fehlen von 0,1 MB in einer Videodatei 71 Fehlerzeilen. Wenn das Video vollständig heruntergeladen und nicht beschädigt wurde, werden keine Fehler gefunden und keine Zeilen in test.log gedruckt.


Bearbeiten

In dem oben angegebenen Beispiel habe ich die gesamte Datei getestet, da das von mir heruntergeladene Testvideo ein Torrent war, in dem möglicherweise Teile in der Datei fehlen.

Durch Hinzufügen -sseof -60zur Liste der Argumente werden die letzten 60 Sekunden der Datei überprüft, was erheblich schneller ist.

ffmpeg -v error -sseof -60 -i FILENAME.mp4 -f null - 2>test.log

Sie benötigen eine neuere Version von ffmpeg, 2.8 fehlte das sseof-Flag, daher habe ich 3.0 verwendet.

J363
quelle
1
Das funktioniert irgendwie, aber es erfordert die Verarbeitung des gesamten Videos. Als alternative Methode stellte ich fest, dass das Öffnen des Videos in VLC und das Klicken gegen Ende weniger Zeit in Anspruch nimmt und praktischer ist. Ist es möglich, ähnliche Dinge in zu definieren ffmpeg? Ich meine, 99% zu suchen, ohne das gesamte Video zu verarbeiten, und zu überprüfen, ob es ohne Fehler funktioniert.
Ho1
@ Ho1 siehe den aktualisierten Befehl.
J363
1
Ich bin mir sicher, dass der Befehl funktioniert, da ich ihn mehrmals mit und ohne das Flag -sseof getestet habe. Der ursprüngliche Befehl überprüft die gesamte Datei. Dies ist das vorgeschlagene Verhalten. Der von Ihnen angeforderte geänderte Befehl bestätigt die Annahme, dass am Ende der Datei Daten im Befehl fehlen, was möglicherweise nicht der Fall ist. Meine Testdatei besteht zu 99,9% aus 137 MB MP4, die mit einem Torrent-Client heruntergeladen wurden. Wenn ich das Flag -sseof verwende und die Zeitspanne, in der es rückwärts aussieht, schrittweise erhöhe, erhalte ich schließlich genau die gleiche Ausgabe, als hätte ich den Befehl ausgeführt, der die gesamte Datei durchsucht.
J363
1
Mit -ssund -sseofliest und verarbeitet ffmpeg die gesamte Datei. Das Öffnen des Videos in VLC und das Klicken gegen Ende wäre daher sowieso schneller.
Ho1
1
Sie haben Recht, aber ich lade über http herunter.
Ho1
7

MediaInfo zeigt eine Zeile an:

Truncated: Yes

wenn eine Datei nicht vollständig ist, wie in den Formatspezifikationen erwartet.

Da es technisch keinen Unterschied zwischen einer Datei gibt, die falsch (nicht den Spezifikationen bezüglich der Dateigrenzen) muxte und teilweise heruntergeladene Dateien enthält, ist es technisch unmöglich, den Unterschied zwischen einer fehlerhaften Datei und einer teilweise heruntergeladenen Datei zu machen.

Ein weiterer (fortgeschrittener) Test könnte durchgeführt werden, z. B. das Lesen des Index einer MP4-Datei und das Überprüfen, ob der Dateiversatz + die Frame-Größe des letzten Frames innerhalb der Dateigröße der Datei liegt, die Sie erhalten, aber nicht genau das, wonach Sie suchen für (wenn sich Metadaten, z. B. Poster in der Quelldatei, am Ende der Datei befinden und die Datei kurz vor diesem Poster abgeschnitten wird, wird der teilweise Download immer noch nicht in jedem Fall erkannt). Es ist nicht in MediaInfo implementiert, Sie können jedoch eine MediaInfo-Funktionsanforderung hinzufügen .

In allen Fällen ist es sehr schwierig, alle Teildownloads zu erkennen, da die Gesamtdateigröße in den meisten Videodateiformaten nicht angegeben ist, sodass Sie sicher sein können, dass eine Datei abgeschnitten ist, aber Sie können nicht sicher sein, dass eine Datei nicht abgeschnitten ist. Die einzige Möglichkeit, um sicherzugehen, dass Sie die gesamte Datei heruntergeladen haben, besteht darin, die Dateigröße von einem anderen Ort abzurufen (und besser: Sie haben den Hash, z. B. MD5).

PS: Diese Frage ist für kein Betriebssystem spezifisch.

Jérôme Martinez
quelle
Danke für deine Antwort. Ich möchte keine genaue Antwort, eine ungefähre Antwort würde mir ausreichen. Denken Sie, dass diese Frage auf superuser.com verschoben werden sollte?
Ho1
Ich konnte ein solches Feld nicht einmal mit mediainfo Version v0.7.83 -f(vollständige Informationsanzeige) erhalten. Könnten Sie bitte helfen, TruncatedFeld zu bekommen ?
Ho1
Entfernen Sie einfach 1 Byte in Ihrer Datei und Sie sollten dieses "abgeschnittene" Feld anzeigen lassen (keine Notwendigkeit von -f, Standardausgabe ist ausreichend). Zu Ihrer Information, es ist für die heute am häufigsten verwendeten Formate implementiert: MP4 / MOV, Matroska, MXF. Testen Sie mit einem anderen Format?
Jérôme Martinez
2
Vielen Dank für die Antwort. Um viele Dateien gleichzeitig zu überprüfen, habe ich Folgendes verwendet: mediainfo * | grep -E "^(IsTruncated|Complete name)"Dabei wird der Dateiname der entsprechenden Datei direkt über der Zeile "IsTruncated: Yes" angezeigt.
0x01
4

Ich hatte eine Datei, in der ffmpeg (v3.1.1) mit -sseof -60 keine Warnungen zeigte und nur ohne Hinweis darauf beendet wurde, dass etwas nicht stimmte. Mediainfo zeigte auch nicht an, dass die Datei abgeschnitten wurde. Wenn Sie nur -sseof -60 weglassen, wird ein Fehler mit ffmpeg gemeldet. Also versuchte ich es erneut mit ffprobe. Es schien etwas schneller als ffmpeg.

ffprobe -v error -count_frames -i filename.mp4

produzierte diese Ausgabe

[h264 @ 00000000004e6a60] Invalid NAL unit size.
[h264 @ 00000000004e6a60] Error splitting the input into NAL units.
[mov,mp4,m4a,3gp,3g2,mj2 @ 00000000004e5280] stream 1, offset 0x1350135: partial file

Ich habe noch keine Fehlalarme festgestellt (wie vom OP gemeldet).

Bearbeiten : ffprobe war in meinen Testdateien etwa 10% schneller als ffmpeg, aber nur, wenn Sie es anweisen, alle Kerne mit der Option '-threads 0' zu verwenden. Ansonsten verwendet es nur einen Kern / Thread und ist langsamer.

Jan Ehrhardt
quelle
Dies gibt keine Antwort auf die Frage. Sobald Sie einen ausreichenden Ruf haben, können Sie jeden Beitrag kommentieren . Geben Sie stattdessen Antworten, die nicht vom Fragesteller geklärt werden müssen . - Von der Überprüfung
Braiam
@Braiam Es beantwortet die Frage, da eine vollständig heruntergeladene Datei keine Ausgabe erzeugt und eine unvollständige Datei.
Jan Ehrhardt