it-swarm.com.de

Wie aktiviere ich die FFMPEG-Protokollierung und wo finde ich die FFMPEG-Protokolldatei?

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.

26
undefined

FFmpeg schreibt nicht in eine bestimmte Protokolldatei, sondern sendet seine Ausgabe an Standardfehler . Um das einzufangen, müssen Sie entweder

  • erfassen und analysieren Sie es, wie es generiert wird
  • leiten Sie den Standardfehler in eine Datei um und lesen Sie, dass der Prozess danach abgeschlossen ist

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.)

25
Stu Thompson

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.

16
MythBuster

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.

6
Geovanny1974

wenn Sie dies der Befehlszeile hinzufügen, wird angezeigt:

 -loglevel debug

oder

 -loglevel verbose

Sie erhalten ausführlichere Debugging-Ausgaben in der Befehlszeile.

3
rogerdpack

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")

2
Peter Cordes

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

1
frank

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

0
Valentin Rocher