FFMPEG - 将FFPROBE的持续时间输出存储为变量

时间:2016-10-18 00:02:42

标签: video command-line cmd ffmpeg

我想在(t,0,0)和#34之间的" enable ='中使用视频的持续时间。确保我每次以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%引用它,但没有运气。

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

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

因此,为了捕获ffprobe的输出并将其分配给环境变量,可以使用如下的批处理代码。

@echo off
setlocal
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 应该处理行按行。

delims=后双引号中的选项/F禁用使用空格和水平制表符作为字符串分隔符将捕获的行拆分为多个标记(字符串)。使用命令行输出 ffprobe 时,"delims="很可能不是必需的。但是我没有安装 ffprobe ,并且没有发布它输出的内容。

2>&1重定向写入 STDERR 的输出以处理由 FOR 处理的 STDOUT 。这里有必要使用>转义运算符&^,以便在执行 ffprobe 时应用此重定向,而不是在解析 FOR 命令行。请参阅Microsoft文章Using command redirection operators。此外, STDERR 重定向到 STDOUT 很可能不需要,因为 ffprobe 输出正确使用所请求的信息 STDOUT

ffprobe 的参数列表中的每个等号也必须使用^进行转义,才能正确传递给 FOR 隐藏的命令进程,以便运行命令。

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

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

答案 1 :(得分:0)

我发现这种解决方案对我来说是最好的,因为它可以从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