ビデオエンコーディングサーバーの容量計画に役立てるために、変換に1分間のビデオがかかる時間を計算しようとしているため、FFMPEGプロセスをログに記録できるようにしたいと考えています。ログを有効にするにはどうすればよいですか。ログファイルはどこに保存されますか。CentOSLAMPマシンにFFMPEGをインストールしています。
8 に答える
FFmpegは特定のログファイルに書き込みませんが、その出力を標準エラーに送信します。それをキャプチャするには、次のいずれかを行う必要があります
- 生成されたとおりにキャプチャして解析します
- 標準エラーをファイルにリダイレクトし、後でプロセスが終了したことを読み取ります
stdエラーリダイレクトの例:
ffmpeg -i myinput.avi {a-bunch-of-important-params} out.flv 2> /path/to/out.txt
プロセスが完了したら、を検査できますout.txt
。
最初のオプションを実行するのは少し難しいですが、それは可能です。(私は自分でやった。他の人もいる。詳細については、SOとネットを見てください。)
私はffmpegDocsで以下のものを見つけました。お役に立てれば!:)
参照: http: //ffmpeg.org/ffmpeg.html#toc-Generic-options
'-report'完全なコマンドラインとコンソール出力を現在のディレクトリのprogram-YYYYMMDD-HHMMSS.logという名前のファイルにダンプします。このファイルはバグレポートに役立ちます。また、-loglevelverboseを意味します。
注:環境変数FFREPORTを任意の値に設定しても、同じ効果があります。
答えが見つかりました。1 /最初にプリセットを入れて、この例「出力フォーマットMPEG2DVDHQ」があります
-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
レポートが必要な場合は、例のようにコマンド-vstats_fileMFRfile.txtをプリセットに含めます。これにより、ファイルSourceのフォルダsourceにあるレポートを作成できます。必要に応じて任意の名前を付けることができます。mpegプロパティに関する完全な.docxを読んで、「このフォーラムで何度も書く」という私の問題を解決しました。最後に、生成されたこのtxtファイルを読み取ってプログレスバーを実行できます。
よろしく。
ffmpeg logs to stderr, and can log to a file with a different log-level from stderr. The -report
command-line option doesn't give you control of the log file name or the log level, so setting the environment variable is preferable.
(-v
はの同義語です-loglevel
。実行ffmpeg -v help
してレベルを確認します。実行ffmpeg -h full | less
してすべてを確認します。または、オンラインドキュメント、またはh.264エンコードガイドなどのwikiページを参照してください)。
#!/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"
これによりsrc.mp4
、x264でトランスコードされ、stderrのログレベルが「verbose」に設定され、ログレベルがout.mkv.log
「status」に設定されます。
(AV_LOG_WARNING=24
、、、AV_LOG_INFO=32
などAV_LOG_VERBOSE=40
)。これのサポートは2年前に追加されたので、ffmpegの非古代バージョンが必要です。(とにかく、セキュリティ/バグ修正とスピードアップのために、常に良い考えです)
A few codecs, like -c:v libx265
, write directly to stderr instead of using ffmpeg's logging infrastructure. So their log messages don't end up in the report file. I assume this is a bug / TODO-list item.
To log stderr, while still seeing it in a terminal, you can use tee(1)
.
If you use a log level that includes status line updates (the default -v info
, or higher), they will be included in the log file, separated with ^M
(carriage return aka \r
). There's no log level that includes encoder stats (like SSIM) but not status-line updates, so the best option is probably to filter that stream.
If don't want to filter (e.g. so the fps / bitrate at each status-update interval is there in the file), you can use less -r
to pass them through directly to your terminal so you can view the files cleanly. If you have .enc
logs from several encodes that you want to flip through, less -r ++G *.enc
works great. (++G means start at the end of the file, for all files). With single-key key bindings like .
and ,
for next file and previous file, you can flip through some log files very nicely. (the default bindings are :n
and :p
).
If you do want to filter, sed 's/.*\r//'
works perfectly for ffmpeg output. (In the general case, you need something like vt100.py
, but not for just carriage returns). There are (at least) two ways to do this with tee + sed: tee
to /dev/tty and pipe tee's output into sed, or use a process substitution to tee into a pipe to sed.
# 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")
For testing a few different encode parameters, you can make a function like this one that I used recently to test some stuff. I had it all on one line so I could easily up-arrow and edit it, but I'll un-obfuscate it here. (That's why there are ;
s at the end of each line)
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
of=25s@21.15.${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
Note that it tests for existence of the output video file to avoid spewing extra garbage into the log file if it already exists. Even so, I used and append (>>
) redirect.
It would be "cleaner" to write a shell function that took args instead of looking at shell variables, but this was convenient and easy to write for my own use. That's also why I saved space by not properly quoting all my variable expansions. ($v
instead of "$v"
)
これをコマンドラインに追加すると、次のように表示されます。
-loglevel debug
また
-loglevel verbose
コマンドラインへのより詳細なデバッグ出力が得られます。
You can find more debugging info just simply adding the option -loglevel debug, full command will be
ffmpeg -i INPUT OUTPUT -loglevel debug -v verbose
コマンドの実行にかかる時間を知りたいだけの場合は、timeコマンドの使用を検討してください。あなたは例えば使用しますtime ffmpeg -i myvideoofoneminute.aformat out.anotherformat
レポートファイルをコンソールの変数として宣言する必要があります。
問題は、あなたが見つけることができるすべてのドキュメンテーションが実行されていないことです..私は正しい方法を見つけるために私のライブの1日を与えられました....
例:バッチ/コンソールの場合
cmd.exe /K set FFREPORT=file='C:\ffmpeg\proto\test.log':level=32 && C:\ffmpeg\bin\ffmpeg.exe -loglevel warning -report -i inputfile f outputfile
Exemple Javascript:
var reortlogfile = "cmd.exe /K set FFREPORT=file='C:\ffmpeg\proto\" + filename + ".log':level=32 && C:\ffmpeg\bin\ffmpeg.exe" .......;
You can change the dir and filename how ever you want.
Frank from Berlin