如何启用 FFMPEG 日志记录以及在哪里可以找到 FFMPEG 日志文件?
-
20-09-2019 - |
题
我希望能够记录 FFMPEG 进程,因为我正在尝试计算出一分钟的视频需要多长时间才能转换,以帮助规划视频编码服务器的容量。如何启用日志记录以及日志文件保存在哪里。我在 CentOS LAMP 机器上安装了 FFMPEG。
解决方案
。不写信给特定的日志文件,而将其输出来 标准的错误.捕捉那,你需要
- 捕捉和分析,因为它是产生
- 重定向标准误差为一个文件并阅读,后来该过程完成之后
例如性传播疾病的错误重定向:
ffmpeg -i myinput.avi {a-bunch-of-important-params} out.flv 2> /path/to/out.txt
一旦这一进程完成后,你可以检查 out.txt
.
这有点棘手做的第一种选择,但这是可能的。(我已经做了它自己。所有其他人。看看周围以及该网的细节。)
其他提示
我发现的ffmpeg文档以下东西。希望这可以帮助! :)
参考: http://ffmpeg.org/ffmpeg.html#toc-Generic-选项
“ - 报告”转储完整的命令行和控制台输出到一个指定的文件 程序YYYYMMDD-HHMMSS.log在当前目录。此文件可以是 bug报告非常有用。它还意味着-loglevel冗长。
注意:设置环境变量FFREPORT为任意值具有 同样的效果。
我找到了答案。 1 /第一放于预置,我有这个例子的“输出格式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
如果你想要一个报告包括-vstats_file MFRfile.txt的命令到像的例子中的预设。这会使它在你的文件来源的文件夹音源的ubicadet的报告。 你可以把任何名字,如果你愿意,我解决我的问题:“我写了许多次在这个论坛”念叨MPEG性质完全.DOCX。最后,我可以做我的进度条读取生成此TXT文件。
问候。
出现,如果此添加到命令行:
-loglevel debug
或
-loglevel verbose
您得到更详细的调试输出到命令行。
ffmpeg 记录到 stderr,并且可以记录到具有与 stderr 不同日志级别的文件。这 -report
命令行选项无法让您控制日志文件名或日志级别,因此最好设置环境变量。
(-v
是同义词 -loglevel
. 。跑步 ffmpeg -v help
查看级别。跑步 ffmpeg -h full | less
看到一切。或咨询 在线文档, ,或者他们的维基页面,例如 H.264 编码指南).
#!/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 的日志级别设置为“详细”,并将 out.mkv.log
到“状态”。
(AV_LOG_WARNING=24
, AV_LOG_INFO=32
, AV_LOG_VERBOSE=40
, , ETC。)。对此的支持是 添加于 2 年前, ,所以你需要一个非古老版本的 ffmpeg。(无论如何,对于安全/错误修复和加速来说,这总是一个好主意)
一些编解码器,例如 -c:v libx265
, ,直接写入 stderr,而不是使用 ffmpeg 的日志记录基础设施。 因此他们的日志消息不会最终出现在报告文件中。我认为这是一个错误/待办事项列表项。
要记录 stderr,同时仍然在终端中看到它,您可以使用 tee(1)
.
如果您使用包含状态行更新的日志级别 (默认 -v info
, 或更高),它们将包含在日志文件中,并以 ^M
(回车又名 \r
)。没有包含编码器统计信息(如 SSIM)但不包含状态行更新的日志级别,因此最好的选择可能是过滤该流。
如果不想过滤(例如因此文件中存在每个状态更新间隔的 fps/比特率),您可以使用 less -r
将它们直接传递到您的终端,以便您可以清晰地查看文件。如果你有 .enc
来自您想要翻阅的多个编码的日志, less -r ++G *.enc
效果很好。(++G 表示从文件末尾开始,对于所有文件)。和 单键键绑定 喜欢 .
和 ,
对于下一个文件和上一个文件,您可以很好地浏览一些日志文件。(默认绑定是 :n
和 :p
).
如果你确实想过滤的话 sed 's/.*\r//'
非常适合 ffmpeg 输出。(一般情况下,你需要一些东西 喜欢 vt100.py
, ,但不仅仅是回车)。使用 tee + sed 有(至少)两种方法可以做到这一点: tee
到 /dev/tty 并将 tee 的输出传送到 sed 中,或者使用进程替换将 tee 传送到 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")
为了测试一些不同的编码参数,您可以创建一个函数 就像我最近用来测试一些东西的这个一样。我把所有内容都写在一行上,这样我就可以轻松地向上箭头并编辑它,但我将在这里取消混淆它。(这就是为什么有 ;
s 在每行末尾)
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
请注意,它会测试输出视频文件是否存在,以避免在日志文件已存在的情况下向日志文件中注入额外的垃圾。即便如此,我还是使用并附加了 (>>
)重定向。
编写一个采用 args 而不是查看 shell 变量的 shell 函数会更“干净”,但这对于我自己的使用来说很方便且易于编写。这也是为什么我没有正确引用所有变量扩展来节省空间。($v
代替 "$v"
)
您必须声明reportfile作为控制台变量。
但问题是你能找到不运行,因此Dokumentations .. 我得到1-一天,我的生活找到正确的方式....
例:批式/控制台
的cmd.exe / K设定FFREPORT =文件= 'C:\ ffmpeg的\原\ test.log中':水平= 32 && C:\ ffmpeg的\ BIN \ ffmpeg.exe -loglevel警告-report -i输入文件˚FOUTPUTFILE
为例使用Javascript:
VAR reortlogfile = “cmd.exe的/ K设定FFREPORT =文件='C:\ ffmpeg的\原\” +文件名+”的.log':水平= 32 && C:\ ffmpeg的\ BIN \ ffmpeg.exe”。 ......;
您可以更改要怎么过的目录和文件名。
弗兰克从柏林
如果你只是想知道需要多长时间要执行的命令,你可以考虑使用时间命令。你例如使用time ffmpeg -i myvideoofoneminute.aformat out.anotherformat