【问题标题】:FFMPEG - Store FFPROBE's duration output as a variableFFMPEG - 将 FFPROBE 的持续时间输出存储为变量
【发布时间】:2016-10-18 00:02:41
【问题描述】:

我想在“enable='between(t,0,0)”字段中使用视频的时长,以确保每次都以视频时长的 1/3 叠加图像。

根据FFMPEG在他们网站上的信息,我需要使用这个

ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4

它确实返回了一个值,但我似乎无法将其设置为可用变量,我已经尝试过使用

set duration=ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4

然后通过 %duration% 引用它,但没有运气。

有没有办法做到这一点,我做错了什么?

感谢您的帮助。

【问题讨论】:

标签: video command-line cmd ffmpeg


【解决方案1】:

用于处理控制台应用程序输出的命令是FOR

如下所示的批处理文件代码可用于捕获ffprobe 的输出并将其分配给环境变量。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not exist input.mp4 goto :EOF
for /F "delims=" %%I in ('ffprobe.exe -v error -show_entries format^=duration -of default^=noprint_wrappers^=1:nokey^=1 input.mp4 2^>^&1') do set "duration=%%I"
echo Duration is: %duration%
endlocal

带有选项/F 的命令FOR' 中包含的字符串解释为要执行的命令,写入STDOUT 的输出应逐行处理。 FOR 分别为cmd.exe 处理批处理文件为此在后台启动另一个命令进程,其中%ComSpec% /c' 之间的命令行作为附加参数附加,并捕获所有写入处理STDOUT额外启动的后台命令进程。

Windows 命令处理器cmd.exe 处理批处理文件在空格之间也解释为逗号,、分号;、等号= 和OEM 编码的不间断空格 (带有十进制代码值255)为参数分隔符。出于这个原因,有必要在命令行中使用^ 转义每个= 以传递给在后台启动的cmd.exe,以便通过cmd.exe 处理批处理文件而不是参数分隔符将等号解释为文字字符.

2>&1 将写入 STDERR(标准错误)的输出重定向到处理由 FOR 处理的 STDOUT(标准输出)。这里有必要使用 ^ 转义运算符 >& 以在执行 ffprobe 时应用此重定向,而不是在解析 FOR 时解释重定向命令行。请参阅 Microsoft 文章 Using command redirection operators。如果 ffprobe 在正确使用时将请求的信息输出到 STDOUT,则可能不需要将 STDERR 重定向到 STDOUT。但如果 ffprobe 将数据输出到 STDERR 可能很重要。

所以在后台执行如下,Windows 安装到C:\Windows:

C:\Windows\System32\cmd.exe /c ffprobe.exe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4 2>&1

根据在 Windows command prompt 窗口中运行 cmd /? 的帮助输出所解释的语法,这是绝对有效的 Windows 命令处理器执行。

/F 之后的双引号中的选项delims= 禁止使用空格和水平制表符作为字符串分隔符将捕获的行拆分为多个标记(字符串),因为它定义了一个空的字符串分隔符列表。 "delims=" 很可能对于使用命令行输出 ffprobe 是不必要的。但是我没有安装 ffprobe 并且没有发布它输出的问题。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?

【讨论】:

    【解决方案2】:

    我发现这个解决方案对我来说是最好的,它可以从 ffprobe 中提取一些信息到变量中。

    也许它可以在未来帮助其他人: Bash Script to get info from ffprobe

    示例:

    INPUT='C:\Users\tl\Downloads\f18\MyWork\test.mov'
    eval $(ffprobe -v quiet -show_format -of flat=s=_ -show_entries stream=height,width,nb_frames,duration,codec_name $INPUT);
    width=${streams_stream_0_width};
    height=${streams_stream_0_height};
    bitrate=$((${format_bit_rate}/1000));
    echo $width,$height,$bitrate;
    read
    

    【讨论】:

      猜你喜欢
      • 2020-07-29
      • 2017-11-13
      • 1970-01-01
      • 2022-11-10
      • 2016-06-10
      • 2015-05-03
      • 1970-01-01
      • 2015-08-15
      • 2011-09-08
      相关资源
      最近更新 更多