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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFMPEG - 将FFPROBE的持续时间输出存储为变量相关的知识,希望对你有一定的参考价值。

我想在(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	lDownloadsf18MyWork	est.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

以上是关于FFMPEG - 将FFPROBE的持续时间输出存储为变量的主要内容,如果未能解决你的问题,请参考以下文章

fluent-ffmpeg 常用函数

FFmpeg三件套之FFprobe使用介绍

每秒获取比特数 FFmpeg/Mediainfo

ffmpeg使用说明:ffmpeg/ffplay/ffprobe

如何从 ffmpeg 输出中提取持续时间?

FFmpeg视频处理入门ffprobe & ffmpeg