2010-01-14 7 views

Antwort

23

FFmpeg schreibt nicht auf eine bestimmte Protokolldatei, sondern sendet seine Ausgabe an standard error. Zu erfassen, dass, müssen Sie entweder

  • erfassen und analysieren es, wie es erzeugt wird
  • Standardfehler in eine Datei umleiten und gelesen, dass danach der Prozess beendet ist

Beispiel für std Fehler Umleitung :

ffmpeg -i myinput.avi {a-bunch-of-important-params} out.flv 2> /path/to/out.txt 

Sobald der Prozess abgeschlossen ist, können Sie out.txt überprüfen.

Es ist ein bisschen schwieriger, die erste Option zu tun, aber es ist möglich. (Ich habe es selbst getan. So haben andere. Schauen Sie sich SO und das Netz für Details an.)

+0

Während ffmpeg möglicherweise keine Option zum Schreiben von Protokolldateien bietet, erstellt der Encoder je nach Codec und Optionen Protokolle. Und das kann sehr störend sein, da es dort steht, wo es ausgeführt wurde, was zu Berechtigungsproblemen führen kann. In meinem Fall war es ein Problem mit ** PHP ** und mit "-pass 1/2". – cregox

+1

@Stu Thompson, das Problem hier ist, dass ffmpeg nicht normale Debugausgabe zu stderr produziert, wenn ffmpeg nicht von einer Konsole ausgeführt wird, aber programmatisch ausgeführt wird (es prüft, ob es ein TTY ist). – Tom

+0

@Tom: Ich habe dieses Problem nicht, mein Java-Code ruft FFmpeg programmgesteuert ohne Probleme auf. Und ich bin nicht der Einzige. –

0

Wenn Sie nur wissen möchten, wie lange es dauert, bis der Befehl ausgeführt wird, können Sie die time verwenden Befehl. Sie verwenden zum Beispiel time ffmpeg -i myvideoofoneminute.aformat out.anotherformat

6

Ich finde die Antwort. 1/First in den Voreinstellungen setzen, 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 ein Bericht erstellt werden soll, die Befehle -vstats_file MFRfile.txt in den Voreinstellungen wie das Beispiel enthält. Dies kann einen Bericht erstellen, der in der Ordnerquelle der Datei Quelle enthalten ist. Sie können einen beliebigen Namen setzen, wenn Sie wollen, löste ich mein Problem "Ich schreibe viele Male in diesem Forum" Lesen einer kompletten .docx über MPEG-Eigenschaften. endlich kann ich meinen Fortschrittsbalken lesen diese erzeugte TXT-Datei.

Grüße.

+0

+1 Fortschrittsbalken –

15

Ich fand die folgenden Sachen in ffmpeg Docs. Hoffe das hilft! :)

Referenz: http://ffmpeg.org/ffmpeg.html#toc-Generic-options

‚-report‘ Dump volle Befehlszeile und Konsolenausgabe an eine Programm-JJJJMMTT-HHMMSS.log im aktuellen Verzeichnis mit dem Namen Datei. Diese Datei kann nützlich für Fehlerberichte sein. Es bedeutet auch -loglevel ausführlich.

Hinweis: Um die Umgebungsvariable FFREPORT auf einen beliebigen Wert einstellen hat den gleichen Effekt.

+2

erscheint in diesen Tagen FFREPORT kann auch einen Ausgabedateinamen angeben, siehe http://StackOverflow.com/Questions/11241878/FFMPEG-Report-Generation/14417386#14417386 auch NB, dass die Angabe "-report" automatisch Protokollierung setzt Ich glaube an einen ausführlichen Modus. – rogerdpack

+0

Können Sie -report verwenden und den Loglevel zum Debuggen ändern? – MarcusJ

+0

@MarcusJ: Ja, benutze 'of = out.mkv; FFREPORT = "level = 32: file = $ of.log" ffmpeg -v verbose ... "$ von" ', um die Protokollierungsstufe für stderr auf" ausführlich "und die Protokollierungsstufe für" out.mkv.log "festzulegen zu "Status". (AV_LOG_WARNING = 24, AV_LOG_INFO = 32, AV_LOG_VERBOSE = 40). Unterstützung dafür war [vor 2 Jahren hinzugefügt] (https: //trac.ffmpeg.org/ticket/3057 # comment: 5), also brauchst du eine nicht alte Version von ffmpeg. –

3

scheint, dass, wenn Sie diese Zeile mit dem Befehl hinzufügen:

-loglevel debug 

oder

-loglevel verbose 

Sie erhalten ausführlichere Debugging-Ausgabe auf der Kommandozeile.

0

Sie müssen die Berichtsdatei als Variable für die Konsole deklarieren.

Problem ist umso Dokumentations Sie so nicht laufen finden .. Ich war mein 1 Tag von dem, leben, den richtigen Weg zu finden ....

Beispiel: für Batch/console

cmd.exe/K set FFREPORT = Datei = 'C: \ ffmpeg \ proto \ test.log': level = 32 & & C: \ ffmpeg \ bin \ ffmpeg.exe -loglevel warning -report -i Eingabedatei f Ausgabedatei

Beispiel Javascript:

var reortlogfile = "cmd.exe/K set FFREPORT = Datei = 'C: \ ffmpeg \ proto \" + Dateiname + ".log': level = 32 & & C: \ ffmpeg \ bin \ ffmpeg.exe" .. .....;

Sie können das Verzeichnis und den Dateinamen beliebig ändern.

Frank aus Berlin

2

ffmpeg Protokolle stderr und mit einem anderen Log-Level von stderr in eine Datei anmelden können. Die Befehlszeilenoption -report gibt Ihnen keine Kontrolle über den Protokolldateinamen oder die Protokollebene, daher ist das Festlegen der Umgebungsvariablen vorzuziehen.

(-v ist ein Synonym für -loglevel. Führen Sie ffmpeg -v help die Ebenen zu sehen. ffmpeg -h full | less Führen Sie alles zu sehen. Oder finden Sie in der online docs oder ihre Wiki-Seiten wie the h.264 encode guide).

#!/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" 

Die src.mp4 mit x264 TRANCODE wird, und stellen Sie die Protokollebene für stderr auf „ausführlichen“ und die Protokollebene für out.mkv.log auf „Status“.

(AV_LOG_WARNING=24, AV_LOG_INFO=32, AV_LOG_VERBOSE=40 usw.). Unterstützung dafür war added 2 years ago, also brauchen Sie eine nicht-alte Version von ffmpeg. (Immer eine gute Idee, wie auch immer, für die Sicherheit/Fehlerbehebung und speedups)


Einige Codecs, wie -c:v libx265, schreibt, sondern direkt in stderr von ffmpeg der Protokollierung Infrastruktur. Ihre Protokollnachrichten enden also nicht in der Berichtsdatei. Ich nehme an, dies ist ein Fehler/TODO-Listenelement.

Um stderr zu protokollieren, während es noch in einem Terminal angezeigt wird, können Sie tee(1) verwenden.


Wenn Sie eine Protokollebene verwenden, die Statuszeile aktualisiert (Standard -v info oder höher) umfasst, werden sie in der Log-Datei aufgenommen werden, getrennt mit ^M (Carriage Return aka \r). Es gibt keine Protokollstufe, die Encoder-Statistiken (wie SSIM) enthält, aber keine Statuszeilen-Updates, daher ist es wahrscheinlich die beste Option, diesen Stream zu filtern.

Wenn nicht gefiltert werden soll (z.B.Damit die fps/Bitrate bei jedem Statusaktualisierungsintervall in der Datei vorhanden ist, können Sie less -r verwenden, um sie direkt an Ihr Terminal weiterzuleiten, damit Sie die Dateien sauber anzeigen können. Wenn Sie .enc Protokolle von mehreren Kodierungen haben, die Sie durchblättern möchten, funktioniert less -r ++G *.enc funktioniert super. (++ G bedeutet Start am Ende der Datei, für alle Dateien). Mit single-key key bindings wie . und , für nächste Datei 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 ffmpeg Ausgabe. (Im allgemeinen Fall benötigen Sie etwas like vt100.py, aber nicht nur für Wagenrückgaben). Es gibt (mindestens) zwei Möglichkeiten, dies mit tee + sed zu tun: tee nach/dev/tty und Pipe-Tee-Ausgabe in sed, oder verwenden Sie eine Prozesssubstitution, um in eine Rohrleitung nach sed zu t-ten.

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

Für ein paar verschiedene Kodierungsparameter zu testen, können Sie eine Funktion wie diese machen, die ich vor kurzem ein paar Sachen zu testen. Ich hatte alles in einer Zeile, so dass ich es leicht aufpfeilen und bearbeiten konnte, aber ich werde es hier enthüllen. (Aus diesem Grunde 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 

anzumerken, dass es für die Existenz der Ausgabevideodatei prüft zusätzlichen Müll in die Log-Datei zu vermeiden, spuckt, wenn sie bereits vorhanden ist. Trotzdem habe ich die Umleitung verwendet und angehängt (>>).

Es wäre "sauberer", eine Shell-Funktion zu schreiben, die Args anstelle von Shell-Variablen verwendet, aber das war bequem und einfach für mich selbst zu schreiben. Das ist auch der Grund, warum ich Platz gespart habe, indem ich nicht alle meine variablen Erweiterungen richtig zitiert habe. (statt "$v")