Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 如何启用FFMPEG日志记录以及在哪里可以找到FFMPEG日志文件?_File_Logging_Encoding_Ffmpeg_Capacity Planning - Fatal编程技术网

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

File 如何启用FFMPEG日志记录以及在哪里可以找到FFMPEG日志文件?,file,logging,encoding,ffmpeg,capacity-planning,File,Logging,Encoding,Ffmpeg,Capacity Planning,我希望能够记录FFMPEG过程,因为我正在尝试计算一分钟的视频转换需要多长时间,以帮助我的视频编码服务器进行容量规划。如何启用日志记录以及日志文件保存在何处。我在CentOS LAMP机器上安装了FFMPEG。FFMPEG不会写入特定的日志文件,而是将其输出发送到。要捕捉到这一点,您需要 在生成时捕获并解析它 将标准错误重定向到文件,并在处理完成后读取该文件 std错误重定向示例: ffmpeg -i myinput.avi {a-bunch-of-important-params} out

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

FFMPEG不会写入特定的日志文件,而是将其输出发送到。要捕捉到这一点,您需要

  • 在生成时捕获并解析它
  • 将标准错误重定向到文件,并在处理完成后读取该文件
std错误重定向示例:

ffmpeg -i myinput.avi {a-bunch-of-important-params} out.flv 2> /path/to/out.txt
完成此过程后,您可以检查
out.txt


做第一个选择有点棘手,但这是可能的。(我自己做了。其他人也有。看看周围的细节和网络。)

< P>如果你只想知道命令执行需要多长时间,你可以考虑使用命令。例如,您可以使用
time-ffmpeg-i myvideoofoneminute.a格式输出。另一种格式
我可以找到答案。 1/首先输入预设,我有一个示例“输出格式MPEG2 DVD HQ”

如果您想要报告,请将命令-vstats_文件MFRfile.txt包含到预设中,如示例所示。这可以生成一个报告,该报告位于文件源的文件夹source中。 如果你愿意,你可以用任何名字,我解决了我的问题“我在这个论坛上写了很多次”,阅读了一篇关于mpeg属性的完整的.docx。最后我可以做我的进度条读取这个txt文件生成


问候。

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

参考:

“-report”将完整的命令行和控制台输出转储到名为 当前目录中的program-YYYYMMDD-HHMMSS.log。此文件可以是 对于bug报告很有用。它还意味着-loglevelverbose

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


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

 -loglevel debug


您将获得更多详细的调试输出到命令行。

您必须将reportfile声明为console的变量

问题是你能找到的所有Dokumentation都没有运行,所以。。 我有一天的时间去寻找正确的道路

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

cmd.exe/K set-FFREPORT=file='C:\ffmpeg\proto\test.log':level=32&&C:\ffmpeg\bin\ffmpeg.exe-loglevel-warning-report-i inputf outputfile

Javascript示例:

var reortlogfile=“cmd.exe/K set-FFREPORT=file='C:\ffmpeg\proto\'+filename+.log':level=32&&C:\ffmpeg\bin\ffmpeg.exe“

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


柏林的Frank

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

-v
-loglevel
的同义词。运行
ffmpeg-v help
查看级别。运行
ffmpeg-h full | less
查看所有内容。或者参考,或类似的wiki页面)

这将使用x264对src.mp4进行tracode
src.mp4
,并将stderr的日志级别设置为“verbose”,将
out.mkv.log
的日志级别设置为“status”

AV_LOG_WARNING=24
AV_LOG_INFO=32
AV_LOG_VERBOSE=40
,等等)。对它的支持是,所以您需要一个非古代版本的ffmpeg。(无论如何,对于安全性/错误修复和加速来说,这始终是个好主意)


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

要记录stderr,而在终端中仍然可以看到它,可以使用


如果使用包含状态行更新的日志级别(默认的
-v info
或更高版本),则它们将包含在日志文件中,并用
^M
分隔(回车符又名
\r
)。没有包含编码器统计信息(如SSIM)但不包含状态行更新的日志级别,因此最好的选择可能是过滤该流

如果不想过滤(例如,文件中存在每个状态更新间隔的fps/比特率),您可以使用
less-r
将它们直接传递到您的终端,以便清晰地查看文件。如果您有要翻阅的多个编码的
.enc
日志,
less-r++G*.enc
效果很好。(++G表示从文件末尾开始,适用于所有文件)。使用like
作为下一个文件和上一个文件,您可以很好地浏览一些日志文件。(默认绑定是
:n
:p

如果您确实想进行过滤,
sed's/*\r/'
非常适合ffmpeg输出。(在一般情况下,您需要一些东西,但不仅仅是回车)。对于tee+sed,有(至少)两种方法可以做到这一点:
tee
to/dev/tty,并将T形管的输出转换为sed,或者使用流程替换将T形管转换为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)

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

编写一个接受args的shell函数而不是查看shell变量会更“干净”,但这样做既方便又方便
 -loglevel verbose
#!/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"
# 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
ffmpeg -i INPUT OUTPUT -loglevel debug -v verbose