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

Neo*_*les 2 video command-line cmd ffmpeg

我想在(t = 0,0)之间的"enable ="字段中使用视频的持续时间,以确保每次以视频持续时间的1/3覆盖图像.

根据FFMPEG在其网站上的信息,我需要使用它

ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
Run Code Online (Sandbox Code Playgroud)

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

set duration=ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢您的帮助.

Mof*_*ofi 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
Run Code Online (Sandbox Code Playgroud)

命令FOR with option /F' 作为命令包含的字符串解释为执行,应该逐行处理写入STDOUT的输出.

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

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

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

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

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