ffmpeg/for 循环:如何使 ffmpeg 或 cmd 循环在发现错误后停止?

Posted

技术标签:

【中文标题】ffmpeg/for 循环:如何使 ffmpeg 或 cmd 循环在发现错误后停止?【英文标题】:ffmpeg/for loop: How to make ffmpeg or cmd loop stops after it founds an error? 【发布时间】:2021-08-14 16:00:12 【问题描述】:

我正在尝试创建一个 bat 文件以从视频中创建多个 gif,到目前为止我做得还不错。

我设法创建了这个命令

@echo off

FOR /L %%A IN (0,5,3600) DO (ffmpeg -ss %%A -t 3 -i "%~1" -vf "fps=10,scale=360:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 -fs 1000000  "output %%~nxA.gif")

问题是我对 1h 视频使用了一个命令,这将创建 720 个 gifs

问题是当视频持续时间低于 1 小时时,bat 文件会继续运行并创建空的 gif 文件,直到达到 720 个 gif 文件

我需要知道我应该使用什么命令。

我试过-abort_on empty_output-abort_on empty_output_stream-xerror

但这些都不起作用

我也是用for循环命令,所以不知道是ffmpeg问题还是for循环问题

帮帮我!

【问题讨论】:

【参考方案1】:

建议您不要使用固定的3600,而是使用ffprobe 来获取视频的时长。 要么通过另一个for循环...

@ECHO off

FOR /F "delims=" %%A IN ('ffprobe -v 0 -show_entries format^=duration -of compact^=p^=0:nk^=1 "%~1"') DO ^
FOR /L %%B IN (0,5,%%A) DO ^
ffmpeg -ss %%B -t 3 -i "%~1" -vf "fps=10,scale=360:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" "%~n1_%%B.gif"

...或使用变量...

@ECHO off

FOR /F "delims=" %%A IN ('ffprobe -v 0 -show_entries format^=duration -of compact^=p^=0:nk^=1 "%~1"') DO SET dur=%%A
FOR /L %%A IN (0,5,%dur%) DO ^
ffmpeg -ss %%A -t 3 -i "%~1" -vf "fps=10,scale=360:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" "%~n1_%%A.gif"

【讨论】:

以上是关于ffmpeg/for 循环:如何使 ffmpeg 或 cmd 循环在发现错误后停止?的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg for ios架构:中级

使用 FFMpeg for android 解码视频

Windows系统下编译FFmpeg for Android(支持x264)

FFmpeg for XP(x86) 2016-03-23 static 静态编译程序

Windows 中的 FFMPEG for android 无法成功编译

如何使 ffmpeg 推流帧率5