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 循环在发现错误后停止?的主要内容,如果未能解决你的问题,请参考以下文章
Windows系统下编译FFmpeg for Android(支持x264)
FFmpeg for XP(x86) 2016-03-23 static 静态编译程序