我希望能够记录FFMPEG进程,因为我想计算一分钟视频转换需要多长时间,以帮助规划我的视频编码服务器的容量。如何启用日志记录,以及日志文件保存在哪里?我在一个CentOS LAMP机器上安装了FFMPEG。
我希望能够记录FFMPEG进程,因为我想计算一分钟视频转换需要多长时间,以帮助规划我的视频编码服务器的容量。如何启用日志记录,以及日志文件保存在哪里?我在一个CentOS LAMP机器上安装了FFMPEG。
FFmpeg不会将输出写入特定的日志文件,而是将其发送到标准错误流。要捕获它,您需要:
标准错误流重定向示例:
ffmpeg -i myinput.avi {a-bunch-of-important-params} out.flv 2> /path/to/out.txt
一旦进程完成,您可以检查out.txt
。
第一种选项有点棘手,但是它是可行的。(我自己也做过。其他人也做过。请在SO和网络上寻找详细信息。)
of=out.mkv; FFREPORT="level=32:file=$of.log" ffmpeg -v verbose ... "$of"
将stderr的日志级别设置为“verbose”,并将out.mkv.log
的日志级别设置为“status”(AV_LOG_WARNING=24
,AV_LOG_INFO=32
,AV_LOG_VERBOSE=40
)。支持此功能已于2年前添加,因此您需要使用非古老版本的ffmpeg。 - Peter Cordes-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
FFmpeg记录日志到标准错误输出(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"
这将使用x264重新编码src.mp4
,并将stderr的日志级别设置为“verbose”,将out.mkv.log
的日志级别设置为“status”。
(AV_LOG_WARNING=24
,AV_LOG_INFO=32
,AV_LOG_VERBOSE=40
等)。这项功能支持是在2年前添加的,因此您需要使用非古老版本的ffmpeg。(出于安全/错误修复和加速的考虑,这总是一个好主意)
有一些编解码器,例如-c:v libx265
,直接写入标准错误输出而不是使用FFmpeg的日志记录系统。因此,它们的日志消息不会出现在报告文件中。我认为这是一个错误/待办事项。
要记录标准错误输出,并仍然在终端上查看它,您可以使用tee(1)
。
-v info
或更高),它们将被包含在日志文件中,并用^M
(回车符,也称为\r
)分隔。没有日志级别包括编码器统计信息(如SSIM),但不包括状态行更新,因此最好的选择可能是过滤该流。如果不想进行过滤(例如,每个状态更新间隔的fps /比特率都在文件中),可以使用less -r
直接将它们传递到终端,以便您可以清晰地查看文件。如果您有多个编码的.enc
日志要翻阅,less -r ++G *.enc
非常适合。 (++G表示从所有文件的末尾开始。) 使用像.
和,
这样的single-key key bindings来进行下一个文件和上一个文件的翻转,您可以非常好地翻阅一些日志文件。(默认绑定是: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")
为了测试几种不同的编码参数,您可以创建一个函数,就像我最近用来测试一些东西的这个函数一样。我将所有内容都放在一行上,这样我就可以轻松地向上箭头和编辑它,但在这里,我将解密它。 (这就是为什么每行末尾有 ;
)
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
>>
)重定向。$v
而不是"$v"
) -loglevel debug
或者
-loglevel verbose
您可以在命令行中获取更详细的调试输出。
你可以通过添加选项-loglevel debug来查找更多调试信息,完整命令如下:
ffmpeg -i INPUT OUTPUT -loglevel debug -v verbose
如果您只想知道命令执行需要多长时间,可以考虑使用time命令。例如,您可以使用time ffmpeg -i myvideoofoneminute.aformat out.anotherformat
你必须将reportfile声明为控制台的变量。
问题是所有可以找到的文档都无法运行,所以我花了一天时间找到正确的方法...
例如:对于批处理/控制台
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
Javascript示例:
var reortlogfile = "cmd.exe /K set FFREPORT=file='C:\ffmpeg\proto\" + filename + ".log':level=32 && C:\ffmpeg\bin\ffmpeg.exe" .......;
您可以根据需要更改目录和文件名。
来自柏林的Frank
-pass 1/2
有关的问题。 - cregoxffmpeg
命令实际上使用了avconv
fork of FFmpeg,那么肯定有些东西可能已经改变了。) - Peter Cordes