我想在(t = 0,0)之间的“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%引用它,但没有运气。
有没有办法做到这一点,我做错了什么?
谢谢您的帮助。
设计用于处理控制台应用程序输出的命令是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
禁用使用空格和水平制表符作为字符串分隔符将捕获的行拆分为多个标记(字符串)。 "delims="
很可能不需要使用命令行输出ffprobe。但是我没有安装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 /?
我发现这个解决方案对我来说是最好的,可以从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