Ich möchte in der Lage sein, FFMPEG-Prozesse zu protokollieren, weil ich versuche herauszufinden, wie lange es dauert, eine Minute Video zu konvertieren, um die Kapazitätsplanung meines Videocodierungsservers zu unterstützen. Wie aktiviere ich die Protokollierung und wo wird die Protokolldatei gespeichert? Ich habe FFMPEG auf einer CentOS LAMP-Maschine installiert.
FFmpeg schreibt nicht in eine bestimmte Protokolldatei, sondern sendet seine Ausgabe an Standardfehler . Um das einzufangen, müssen Sie entweder
Beispiel für die std-Fehlerumleitung:
ffmpeg -i myinput.avi {a-bunch-of-important-params} out.flv 2> /path/to/out.txt
Sobald der Vorgang abgeschlossen ist, können Sie out.txt
überprüfen.
Die erste Option ist etwas schwieriger, aber es ist möglich. (Ich habe es selbst gemacht. Andere haben auch. Schauen Sie sich SO] und das Netz nach Details an.)
Ich habe das folgende Zeug in ffmpeg Docs gefunden. Hoffe das hilft! :)
Referenz: http://ffmpeg.org/ffmpeg.html#toc-Generic-options
'-Report' Ausgabe der gesamten Befehlszeile und der Konsole in eine Datei namens program-JJJJMMTT-HHMMSS.log im aktuellen Verzeichnis. Diese Datei kann .__ sein. nützlich für Fehlerberichte. Es impliziert auch -loglevel verbose.
Hinweis: Wenn Sie die Umgebungsvariable FFREPORT auf einen beliebigen Wert setzen, wird das .__ verwendet. gleiche Wirkung.
Ich finde die Antwort . 1/Zuerst in die Voreinstellungen, ich habe dieses Beispiel "Ausgabeformat MPEG2 DVD HQ"
-vcodec mpeg2video -vstats_file MFRfile.txt -r 29.97 -s 352x480 -aspect 4:3 -b 4000k -mbd rd -trellis -mv0 -cmp 2 -subcmp 2 -acodec mp2 -ab 192k -ar 48000 -ac 2
Wenn Sie möchten, dass ein Bericht die Befehle -vstats_file MFRfile.txt in die Vorgaben wie im Beispiel einfügt. Dies kann einen Bericht erstellen, der in der Ordnerquelle Ihrer Datei ubicadet ist. Quelle. Sie können jeden beliebigen Namen eingeben, wenn Sie möchten. Ich habe mein Problem gelöst. "Ich schreibe viele Male in diesem Forum" . endlich kann ich meinen Fortschrittsbalken lesen, indem ich diese generierte txt-Datei lese.
Grüße.
wenn Sie dies der Befehlszeile hinzufügen, wird angezeigt:
-loglevel debug
oder
-loglevel verbose
Sie erhalten ausführlichere Debugging-Ausgaben in der Befehlszeile.
ffmpeg protokolliert sich in stderr und kann sich in einer Datei mit einer anderen Protokollebene als stderr anmelden. Die Befehlszeilenoption -report
gibt Ihnen keine Kontrolle über den Namen der Protokolldatei oder die Protokollebene. Daher ist das Festlegen der Umgebungsvariablen vorzuziehen.
(-v
ist ein Synonym für -loglevel
. Führen Sie ffmpeg -v help
aus, um die Ebenen anzuzeigen. Führen Sie ffmpeg -h full | less
aus, um ALLES zu sehen. Oder konsultieren Sie die online docs oder ihre Wiki-Seiten wie die h.264-Kodierungsanleitung ).
#!/bin/bash
of=out.mkv
FFREPORT="level=32:file=$of.log" ffmpeg -v verbose -i src.mp4 -c:a copy -preset slower -c:v libx264 -crf 21 "$of"
Das wird src.mp4
mit x264 trancode und setzt die Protokollebene für stderr auf "verbose" und die Protokollebene für out.mkv.log
auf "status".
(AV_LOG_WARNING=24
, AV_LOG_INFO=32
, AV_LOG_VERBOSE=40
usw.). Support for this was hinzugefügt vor 2 Jahren , daher benötigen Sie eine nicht-alte Version von ffmpeg. (Immer eine gute Idee, für Sicherheits-/Bugfixes und Beschleunigungen)
Einige Codecs wie -c:v libx265
schreiben direkt in stderr, anstatt die Protokollinfrastruktur von ffmpeg zu verwenden. Ihre Protokollnachrichten enden also nicht in der Berichtsdatei. Ich gehe davon aus, dass dies ein Bug/TODO-Listenelement ist.
Um stderr zu protokollieren, während Sie es noch in einem Terminal sehen, können Sie tee(1)
verwenden.
Wenn Sie eine Protokollebene verwenden, die Statuszeilenaktualisierungen enthält (Standardwert -v info
oder höher), werden sie in die Protokolldatei aufgenommen, getrennt durch ^M
(Wagenrücklauf aka \r
). Es gibt keine Protokollebene, die Encoderstatistiken (wie SSIM) enthält, jedoch keine Statuszeilenaktualisierungen. Die beste Option ist daher, diesen Stream zu filtern.
Wenn Sie nicht filtern möchten (z. B. wenn die fps/bitrate bei jedem Statusaktualisierungsintervall in der Datei vorhanden ist), können Sie sie mit less -r
direkt an Ihr Terminal übergeben, um die Dateien sauber anzuzeigen. Wenn Sie .enc
-Protokolle von mehreren Codierungen haben, die Sie durchblättern möchten, funktioniert less -r ++G *.enc
hervorragend. (++ G steht für alle Dateien am Ende der Datei). Mit Single-Key-Tastenkombinationen wie .
und ,
für die nächste und vorherige Datei können Sie einige Protokolldateien sehr schön durchblättern. (Die Standardbindungen sind :n
und :p
).
Wenn Sie filtern möchten, funktioniert sed 's/.*\r//'
perfekt für die ffmpeg-Ausgabe. (Im Allgemeinen benötigen Sie etwas wie vt100.py
, aber nicht nur für die Wagenrückgabe). Es gibt (mindestens) zwei Möglichkeiten, dies mit tee + sed zu tun: tee
nach/dev/tty und die Ausgabe des Tees in sed, oder es wird eine Prozessersetzung verwendet, um in eine Rohrleitung zu sedieren.
# pass stdout and stderr through to the terminal,
## and log a filtered version to a file (with only the last status-line update).
of="$1-x265.mkv"
ffmpeg -v info -i "$1" -c:a copy -c:v libx265 ... "$of" |& # pipe stdout and stderr
tee /dev/tty | sed 's/.*\r//' >> "$of.enc"
## or with process substitution where tee's arg will be something like /dev/fd/123
ffmpeg -v info -i "$1" -c:a copy -c:v libx265 ... "$of" |&
tee >(sed 's/.*\r//' >> "$of.enc")
Zum Testen einiger verschiedener Codierungsparameter können Sie eine Funktion erstellen, mit der ich kürzlich einiges getestet habe. Ich hatte alles in einer Zeile, so dass ich es leicht nach oben ziehen und bearbeiten konnte, aber ich werde es hier entflechten. (Deshalb gibt es ;
s am Ende jeder Zeile)
ffenc-testclip(){
# v should be set by the caller, to a vertical resolution. We scale to WxH, where W is a multiple of 8 (-vf scale=-8:$v)
db=0; # convenient to use Shell vars to encode settings that you want to include in the filename and the ffmpeg cmdline
[email protected]${v}p.x265$pre.mkv;
[[ -e "$of.enc" ]]&&echo "$of.enc exists"&&return; # early-out if the file exists
# encode 25 seconds starting at 21m15s (or the keyframe before that)
Nice -14 ffmpeg -ss $((21*60+15)) -i src.mp4 -t 25 -map 0 -metadata title= -color_primaries bt709 -color_trc bt709 -colorspace bt709 -sws_flags lanczos+print_info -c:a copy -c:v libx265 -b:v 1500k -vf scale=-8:$v -preset $pre -ssim 1 -x265-params ssim=1:cu-stats=1:deblock=$db:aq-mode=1:lookahead-slices=0 "$of" |&
tee /dev/tty | sed 's/.*\r//' >> "$of.enc";
}
# and use it with nested loops like this.
for pre in fast slow; do for v in 360 480 648 792;do ffenc-testclip ;done;done
less -r ++G *.enc # -r is useful if you didn't use sed
Beachten Sie, dass das Vorhandensein der Ausgabevideodatei getestet wird, um zu vermeiden, dass zusätzlicher Abfall in die Protokolldatei fällt, wenn diese bereits vorhanden ist. Trotzdem habe ich eine Umleitung (>>
) verwendet und angehängt.
Es wäre "sauberer", eine Shell-Funktion zu schreiben, die Argumente brauchte, anstatt Shell-Variablen zu betrachten. Dies war jedoch bequem und für meinen eigenen Gebrauch leicht zu schreiben. Deswegen habe ich auch Platz gespart, indem ich alle meine variablen Erweiterungen nicht richtig zitiere. ($v
statt "$v"
)
Sie müssen die Berichtsdatei als Variable für die Konsole deklarieren.
Das Problem ist, dass alle Dokumentationen, die Sie finden können, nicht ausgeführt werden ... Ich hatte einen Tag meines Lebens, um den richtigen Weg zu finden.
Beispiel: für Batch/Konsole
cmd.exe/K set FFREPORT = file = 'C:\ffmpeg\proto\test.log': level = 32 && C:\ffmpeg\bin\ffmpeg.exe -loglevel warning -report -i Eingabedatei für Ausgabedatei
Beispiel Javascript:
var reortlogfile = "cmd.exe/K set FFREPORT = Datei = 'C:\ffmpeg\proto \" + Dateiname + ".log": Ebene = 32 && C:\ffmpeg\bin\ffmpeg.exe ".... ...
Sie können das Verzeichnis und den Dateinamen beliebig ändern.
Frank aus Berlin
Wenn Sie nur wissen möchten, wie lange es dauert, bis der Befehl ausgeführt wird, können Sie den Befehl time verwenden. Sie verwenden zum Beispiel time ffmpeg -i myvideoofoneminute.aformat out.anotherformat