Wie berechnet man die Länge der bisher kodierten Videodatei?

Ich verwende ffmpeg, um eine Videodatei in das H.264-Format zu konvertieren. Wenn ich anrufe ffprobewährend ffmpegdas Video noch läuft ist die Dauer nicht bekannt. Erst nach ffmpegBeendigung ffprobewird die Dauer angezeigt.

Ähnlich, wenn ich laufe mplayer, um das Video abzuspielen, während es noch kodiert wird, ist die Dauer entweder unbekannt oder wird falsch angezeigt.

Gibt es eine Möglichkeit, die Dauer des resultierenden Videos (h264 im .mkv-Container) zu ermitteln, während es noch von codiert wird ffmpeg?

Bearbeiten : Ich werde die Frage ein wenig klarer machen.

Mich interessiert, wie lang das bisher enkodierte Video ist . Nehmen wir an, die Eingabedatei ist 1 Minute 45 Sekunden lang. Die resultierende Datei sollte die Länge beibehalten. Aber ich würde gerne wissen, wie viel bisherffmpeg codiert wurde . Wenn wir die Länge des Videos nach Abschluss der Konvertierung bestimmen können, sollte es dann nicht eine Möglichkeit geben, die Länge des bereits verarbeiteten und abspielbereiten Videos zu bestimmen?

Antworten (2)

Kurze Antwort ist Nein.

Längere Antwort ist, es kommt darauf an.

Wenn Sie eine Datei codieren, entspricht die Ausgabe im Allgemeinen der Dauer der Eingabe, es sei denn, es werden Geschwindigkeitsänderungs- oder Trimmfilter oder -ss, -to, -t-optionen angewendet. Bei einer Live-Eingabe stoppt FFmpeg die Codierung, wenn es bei der Eingabe auf EOF stößt. Wenn Sie das also nicht wissen, kennen Sie die Ausgabedauer nicht. Bei mehreren Eingaben unterschiedlicher Dauer hängt es davon ab, was der Befehl ist, z. B. ist dort ein drin -shortest, gibt es ein amix, das standardmäßig die längste der Eingaben ist, oder amergedas bei der kürzesten Eingabe endet.

Standardmäßig zeigt die ffmpeg-Konsolenausgabe den Fortschritt der Codierung in Echtzeit an, dh die bisher codierte Dauer.

Danke für die Erklärung. Ich habe meine Frage bearbeitet und einige Details hinzugefügt. Könnten Sie sie überprüfen und sehen, ob Sie Ihrer Antwort weitere Daten hinzufügen können?
Wie mein letzter Absatz sagt, zeigt ffmpeg diese Informationen bereits in der Konsolenausgabe an, zu der gestreamt wirdstderr
Das ist wahr. Ich habe es komplett übersehen! Danke noch einmal.
Außerdem möchte ich hinzufügen, dass es eine FFmpeg-Option gibt -progress, die bewirkt, dass die oben genannten Fortschrittsinformationen in einem maschinenfreundlichen Format ausgegeben werden, das leicht analysiert werden kann.

Siehe -reportOption. Aus den Manpages:

-Bericht

Sichern Sie die vollständige Befehlszeilen- und Konsolenausgabe in einer Datei mit dem Namen " program-YYYYMMDD-HHMMSS.log " im aktuellen Verzeichnis. Diese Datei kann für Fehlerberichte nützlich sein. Es impliziert auch " -loglevel verbose".

Das Festlegen der Umgebungsvariable FFREPORTauf einen beliebigen Wert hat den gleichen Effekt. Wenn der Wert eine ' :'-separierte Schlüsselwertsequenz =ist , wirken sich diese Optionen auf den Bericht aus; Optionswerte müssen maskiert werden, wenn sie Sonderzeichen oder das Optionstrennzeichen „ :“ enthalten (siehe Abschnitt „Quoting and Escaping“ im ffmpeg-utils-Handbuch).

Folgende Möglichkeiten werden erkannt:

Datei

Legen Sie den für den Bericht zu verwendenden Dateinamen fest; %pwird zum Namen des Programms %terweitert, wird zu einem Zeitstempel erweitert, " %%" wird zu einem einfachen " %" erweitert

Niveau

Stellen Sie die Log-Ausführlichkeitsstufe mit einem numerischen Wert ein (siehe „ -loglevel“).

Um beispielsweise einen Bericht in eine Datei namens ffreport.log mit einer Protokollebene von 32 (Alias ​​für Protokollebene „ info“) auszugeben:

FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output

Fehler beim Analysieren der Umgebungsvariablen sind nicht schwerwiegend und werden nicht im Bericht angezeigt.

Kombinieren Sie mit -statsund Ihr One- | head -n 2 | tail -n 1to-go:

-Statistiken (global)

Kodierfortschritt/Statistiken drucken. Es ist standardmäßig aktiviert, um es explizit zu deaktivieren, müssen Sie " -nostats" angeben.

Wenn Sie Probleme mit dem Fortschrittsbalken haben, \rder dieselbe Zeile neu schreibt, können Sie ffmpeg -stats ... 2>&1 | tr \\r \\nHead&Tail verwenden.