【问题标题】:How do I enable FFMPEG logging and where can I find the FFMPEG log file?如何启用 FFMPEG 日志记录以及在哪里可以找到 FFMPEG 日志文件?
【发布时间】:2011-01-05 04:23:15
【问题描述】:

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

【问题讨论】:

    标签: file logging encoding ffmpeg capacity-planning


    【解决方案1】:

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

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

    std 错误重定向示例:

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

    处理完成后,您可以检查out.txt

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

    【讨论】:

    • 虽然 ffmpeg 可能不提供写入日志文件的选项,但取决于您的编解码器和编码器将创建日志的选项。这可能会非常具有破坏性,因为它是在执行它的地方编写的,这可能会导致权限问题。在我的例子中,这是 PHP 和使用 -pass 1/2 的问题。
    • @Stu Thompson,这里的问题是,当 ffmpeg 不是从控制台运行而是以编程方式执行(它检查它是否是 TTY)时,ffmpeg 不会向 stderr 产生正常的调试输出。
    • @Tom:我没有这个问题,我的 Java 代码以编程方式调用 FFmpeg 没有问题。而且我不是唯一一个。
    • @Stu,我愿意,其他人也一样。 FFMpeg 运行良好,以编程方式调用,但它不生成或向 stderr 生成不同的输出
    • @commonpike:我认为它不会检查标准输出或标准错误,因为将它们都重定向到管道不会改变输出。 (使用 FFmpeg 3.3 从 Linux 上的终端运行)。但是,它可能会检查是否存在控制 tty,即使它的 stdin、stdout 和 stderr 被重定向,进程仍然具有该控制 tty。或者不同版本的ffmpeg可能不同。 (尤其是如果您系统上的ffmpeg 命令确实使用了avconv fork of FFmpeg,那肯定会有所改变。)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      问候。

      【讨论】:

        【解决方案4】:

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

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

        ‘-report’ 将完整的命令行和控制台输出转储到一个名为 program-YYYYMMDD-HHMMSS.log 在当前目录下。这个文件可以 对错误报告很有用。它还暗示 -loglevel 详细。

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

        【讨论】:

        • 这些天出现 FFREPORT 也可以指定输出文件名,请参阅stackoverflow.com/questions/11241878/ffmpeg-report-generation/… 也请注意,我相信指定“-report”会自动将日志记录设置为详细模式。
        • 你能用-report把loglevel改成debug吗?
        • @MarcusJ:是的,使用of=out.mkv; FFREPORT="level=32:file=$of.log" ffmpeg -v verbose ... "$of" 将stderr 的日志级别设置为“verbose”,将out.mkv.log 的日志级别设置为“status”。 (AV_LOG_WARNING=24AV_LOG_INFO=32AV_LOG_VERBOSE=40)。对此的支持是 added 2 years ago,所以你需要一个非古代版本的 ffmpeg。
        • @MarcusJ FFREPORT=file="/my/log/location/%p-%t.log":level=48 ffmpeg -i [...] (compare)
        【解决方案5】:

        如果你把这个添加到命令行中:

         -loglevel debug
        

         -loglevel verbose
        

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

        【讨论】:

          【解决方案6】:

          您必须将报告文件声明为控制台变量。

          问题是您可以找到的所有文档都没有运行,所以.. 我花了 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" 。 ......;

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

          来自柏林的弗兰克

          【讨论】:

            【解决方案7】:

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

            -v-loglevel 的同义词。运行 ffmpeg -v help 可查看关卡。运行 ffmpeg -h full | less 可查看所有内容。或查阅 online docs 或他们的 wiki 页面,如 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 的日志级别设置为“verbose”,将out.mkv.log 的日志级别设置为“status”。

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


            一些编解码器,例如-c:v libx265,直接写入stderr,而不是使用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 输出。 (在一般情况下,您需要like 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"

            【讨论】:

              【解决方案8】:

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

              ffmpeg -i INPUT OUTPUT -loglevel debug -v verbose
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-11-15
                • 1970-01-01
                • 2017-08-28
                • 1970-01-01
                • 1970-01-01
                • 2018-07-02
                • 1970-01-01
                • 2018-10-31
                相关资源
                最近更新 更多