我想在“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% 引用它,但没有运气。
有没有办法做到这一点,我做错了什么?
感谢您的帮助。
最佳答案
为处理控制台应用程序的输出而设计的命令是 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(标准错误)的输出重定向到处理由处理的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/?
转到/?
如果/?
设置/?
setlocal/?
关于video - FFMPEG - 将 FFPROBE 的持续时间输出存储为变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40097486/