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

und*_*ned 28 logging encoding ffmpeg capacity-planning file

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

Stu*_*son 28

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

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

std错误重定向的示例:

ffmpeg -i myinput.avi {a-bunch-of-important-params} out.flv 2> /path/to/out.txt
Run Code Online (Sandbox Code Playgroud)

完成该过程后,您可以进行检查out.txt.

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


小智 18

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

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

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

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

  • 这些天出现FFREPORT也可以指定输出文件名,请参阅http://stackoverflow.com/questions/11241878/ffmpeg-report-generation/14417386#14417386也注意,指定"-report"会自动将记录设置为详细模式,我相信. (3认同)
  • @MarcusJ:是的,使用 `of=out.mkv; FFREPORT="level=32:file=$of.log" ffmpeg -v verbose ... "$of"` 将 stderr 的日志级别设置为“verbose”,将 `out.mkv.log` 的日志级别设置为到“状态”。(`AV_LOG_WARNING=24`、`AV_LOG_INFO=32`、`AV_LOG_VERBOSE=40`)。对此的支持是 [2 年前添加的](https://trac.ffmpeg.org/ticket/3057#comment:5),因此您需要一个非古代版本的 ffmpeg。 (2认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

如果你想要一个报告包含命令-vstats_file MFRfile.txt进入预设就好了.这可以生成一个报告,它在文件Source的文件夹源中是ubicadet.如果你愿意,你可以放任何名字,我解决了我的问题"我在这个论坛上写了很多次"阅读关于mpeg属性的完整.docx.最后我可以通过读取生成的txt文件来完成我的进度条.

问候.


Pet*_*des 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"
Run Code Online (Sandbox Code Playgroud)

这将src.mp4使用 x264 进行转码,并将 stderr 的日志级别设置为“详细”,并将日志级别设置为out.mkv.log“状态”。

AV_LOG_WARNING=24AV_LOG_INFO=32AV_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")
Run Code Online (Sandbox Code Playgroud)

为了测试一些不同的编码参数,您可以创建一个像我最近用来测试一些东西的函数。我把所有内容都写在一行上,这样我就可以轻松地向上箭头并编辑它,但我将在这里取消混淆它。;(这就是为什么每行末尾都有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
Run Code Online (Sandbox Code Playgroud)

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

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