40

ビデオエンコーディングサーバーの容量計画に役立てるために、変換に1分間のビデオがかかる時間を計算しようとしているため、FFMPEGプロセスをログに記録できるようにしたいと考えています。ログを有効にするにはどうすればよいですか。ログフ​​ァイルはどこに保存されますか。CentOSLAMPマシンにFFMPEGをインストールしています。

4

8 に答える 8

38

FFmpegは特定のログファイルに書き込みませんが、その出力を標準エラーに送信します。それをキャプチャするには、次のいずれかを行う必要があります

  • 生成されたとおりにキャプチャして解析します
  • 標準エラーをファイルにリダイレクトし、後でプロセスが終了したことを読み取ります

stdエラーリダイレクトの例:

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

プロセスが完了したら、を検査できますout.txt

最初のオプションを実行するのは少し難しいですが、それは可能です。(私は自分でやった。他の人もいる。詳細については、SOとネットを見てください。)

于 2010-01-15T15:20:26.887 に答える
23

私はffmpegDocsで以下のものを見つけました。お役に立てれば!:)

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

'-report'完全なコマンドラインとコンソール出力を現在のディレクトリのprogram-YYYYMMDD-HHMMSS.logという名前のファイルにダンプします。このファイルはバグレポートに役立ちます。また、-loglevelverboseを意味します。

注:環境変数FFREPORTを任意の値に設定しても、同じ効果があります。

于 2012-03-17T19:35:47.213 に答える
7

答えが見つかりました。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ファイルを読み取ってプログレスバーを実行できます。

よろしく。

于 2010-01-23T15:20:38.050 に答える
5

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

于 2016-08-04T20:14:51.293 に答える
4

これをコマンドラインに追加すると、次のように表示されます。

 -loglevel debug

また

 -loglevel verbose

コマンドラインへのより詳細なデバッグ出力が得られます。

于 2012-07-27T18:09:25.703 に答える
1

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
于 2019-10-25T07:05:26.517 に答える
0

コマンドの実行にかかる時間を知りたいだけの場合は、timeコマンドの使用を検討してください。あなたは例えば使用しますtime ffmpeg -i myvideoofoneminute.aformat out.anotherformat

于 2010-01-15T17:42:11.540 に答える
0

レポートファイルをコンソールの変数として宣言する必要があります。

問題は、あなたが見つけることができるすべてのドキュメンテーションが実行されていないことです..私は正しい方法を見つけるために私のライブの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

于 2015-08-29T16:56:33.050 に答える