40

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

4

8 回答 8

38

FFmpeg 不会写入特定的日志文件,而是将其输出发送到标准错误。要捕获它,您需要

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

标准错误重定向示例:

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

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

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

'-report' 将完整的命令行和控制台输出转储到当前目录中名为 program-YYYYMMDD-HHMMSS.log 的文件中。此文件可用于错误报告。它还暗示 -loglevel 详细。

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

于 2012-03-17T19:35:47.213 回答
7

我找到了答案。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 文件的进度条。

问候。

于 2010-01-23T15:20:38.050 回答
5

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

-v是 的同义词-loglevel。运行ffmpeg -v help查看关卡。运行ffmpeg -h full | less查看所有内容。或查阅在线文档,或他们的 wiki 页面,如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=24AV_LOG_INFO=32AV_LOG_VERBOSE=40等)。对此的支持是在 2 年前添加的,因此您需要一个非古代版本的 ffmpeg。(无论如何总是一个好主意,用于安全/错误修复和加速)


一些编解码器,例如-c:v libx265,直接写入标准错误,而不是使用 ffmpeg 的日志基础设施。 所以他们的日志消息不会出现在报告文件中。我认为这是一个错误/待办事项列表项。

要记录 stderr,同时仍然在终端中看到它,您可以使用tee(1).


如果您使用包含状态行更新的日志级别(默认-v info或更高),它们将包含在日志文件中,并用^M(carriage return aka \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"

于 2016-08-04T20:14:51.293 回答
4

看来,如果您将其添加到命令行:

 -loglevel debug

或者

 -loglevel verbose

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

于 2012-07-27T18:09:25.703 回答
1

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

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

示例 Javascript:

var reortlogfile = "cmd.exe /K set FFREPORT=file='C:\ffmpeg\proto\" + 文件名 + ".log':level=32 && C:\ffmpeg\bin\ffmpeg.exe" .... ...;

您可以随意更改目录和文件名。

来自柏林的弗兰克

于 2015-08-29T16:56:33.050 回答