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

2024-01-09

我想在“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 https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/for.

像下面这样的批处理文件代码可用于捕获输出ffprobe https://ffmpeg.org/ffprobe.html并将其分配给环境变量。

@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

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

Windows 命令处理器cmd.exe处理批处理文件在空格和逗号之间进行解释,, 分号;, 等号=和 OEM 编码的不间断空格 (十进制代码值 255)作为参数分隔符。因此,有必要逃避每一个= with ^在命令行中传递给cmd.exe在后台开始将等号解释为文字字符cmd.exe处理批处理文件而不是参数分隔符。

2>&1将输出重定向到STDERR(标准错误)处理STDOUT(标准输出)由FOR。这里有必要逃避操作员> and & with ^在执行时应用此重定向ffprobe并且不解释已经解析的重定向FOR命令行。请参阅微软文章使用命令重定向运算符 https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb490982(v=technet.10)。这个重定向STDERR to STDOUT也许没有必要,如果ffprobe正确使用时输出所请求的信息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 命令处理器的绝对有效执行cmd /?在 Windows 中命令提示符 https://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt-in-windows-10/ window.

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

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

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐