如何启用FFMPEG日志记录以及在何处可以找到FFMPEG日志文件?

时间:2010-01-14 17:21:53

标签: file logging encoding ffmpeg capacity-planning

我希望能够记录FFMPEG进程,因为我正在尝试计算一分钟视频转换为视频编码服务器的容量规划所需的时间。如何启用日志记录以及保存日志文件的位置。我在CentOS LAMP机器上安装了FFMPEG。

8 个答案:

答案 0 :(得分:26)

FFmpeg不会写入特定的日志文件,而是将其输出发送到standard error。要捕获它,你需要

  • 在生成时捕获并解析
  • 将标准错误重定向到文件,然后读取该过程完成

std错误重定向的示例:

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

完成此过程后,您可以检查out.txt

做第一个选项有点棘手,但它有可能。 (我自己也做过。有其他人。请仔细查看SO和网络。)

答案 1 :(得分:17)

我在ffmpeg文档中找到了以下内容。希望这可以帮助! :)

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

  

' - report'将完整命令行和控制台输出转储到名为的文件   当前目录中的program-YYYYMMDD-HHMMSS.log。这个文件可以   对bug报告很有用。它还暗示了-loglevel verbose。

     

注意:将环境变量FFREPORT设置为任何值都具有   同样的效果。

答案 2 :(得分:6)

我找到了答案。 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进入预设就好的例子。这可以生成一个报告,它在文件Source的文件夹源中是ubicadet。 如果你愿意,你可以放任何名字,我解决了我的问题“我在这个论坛上写了很多次”阅读关于mpeg属性的完整.docx。最后,我可以通过读取生成的txt文件来完成我的进度条。

问候。

答案 3 :(得分:4)

如果将其添加到命令行,则显示

 -loglevel debug

 -loglevel verbose

您可以在命令行中获得更详细的调试输出。

答案 4 :(得分:2)

ffmpeg记录到stderr,并且可以从stderr登录到具有不同日志级别的文件。 -report命令行选项无法控制日志文件名或日志级别,因此最好设置环境变量。

-v-loglevel的同义词。运行ffmpeg -v help查看级别。运行ffmpeg -h full | less查看所有内容。或咨询online docs,或者他们的维基页面如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"

这会将src.mp4转换为x264,并将stderr的日志级别设置为“详细”,将out.mkv.log的日志级别设置为“status”。

AV_LOG_WARNING=24AV_LOG_INFO=32AV_LOG_VERBOSE=40等)。对此的支持是added 2 years ago,所以你需要一个非古老版本的ffmpeg。 (无论如何,对于安全性/错误修正和加速,总是一个好主意)

一些编解码器,如-c:v libx265,直接写入stderr,而不是使用ffmpeg的日志记录基础结构。因此,他们的日志消息不会在报告文件中结束。我假设这是一个bug / TODO列表项。

要记录stderr,同时仍然在终端中看到它,您可以使用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输出。 (在一般情况下,你需要一些like vt100.py,但不仅仅是回车)。有(至少)两种方法可以使用tee + sed:tee到/ dev / tty和pipe 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

请注意,它会测试是否存在输出视频文件,以避免在日志文件中存在额外的垃圾。即便如此,我还是使用并追加(>>)重定向。

编写一个使用args而不是查看shell变量的shell函数会更“干净”,但这对我自己的使用来说非常方便易用。这也是我没有正确引用所有变量扩展来节省空间的原因。 ($v代替"$v"

答案 5 :(得分:1)

您必须将reportfile声明为控制台的变量。

问题是你能找到的所有Dokumentations都没有运行...... 我给了我一天的生命,找到正确的方法......

示例:用于批处理/控制台

cmd.exe / K设置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设置FFREPORT = file =' C:\ ffmpeg \ proto \" + filename +" .log':level = 32&& C:\ ffmpeg的\ BIN \ ffmpeg.exe" .......;

您可以根据需要更改目录和文件名。

来自柏林的弗兰克

答案 6 :(得分:0)

如果您只想知道命令执行所需的时间,可以考虑使用time命令。例如,您使用time ffmpeg -i myvideoofoneminute.aformat out.anotherformat

答案 7 :(得分:0)

只需添加选项-loglevel debug,即可找到更多调试信息,完整的命令将

ffmpeg -i INPUT OUTPUT -loglevel debug -v verbose