批处理脚本中FFmpeg适配任意起始编号图片序列的问题
解决截图转视频的FFmpeg批处理编号问题
问题背景
编写每日截图转视频的批处理脚本时,因每日截图编号无法从0001开始,导致原脚本执行失败。需求是:要么让FFmpeg直接读取文件夹内所有图片(不管起始编号),要么通过批处理获取图片序列的起始/结束编号后传入FFmpeg。
方案一:让FFmpeg自动读取所有图片(无需指定编号)
FFmpeg的image2解复用器支持直接读取文件夹内所有符合格式的图片,无需依赖连续编号或指定起始值。只需修改输入路径写法,去掉-pattern_type sequence和-start_number参数:
修改后的FFmpeg命令片段:
ffmpeg.exe -framerate 25 -i "Y:\ft\!new_folder!\*.jpg" -c:v libx265 -b:v 5000k -g 100 "Y:\ft\!new_folder!.mp4"
说明:FFmpeg会按文件名的字典序读取图片,确保截图文件名的数字部分连续递增即可(无需从0001开始)。
方案二:通过批处理获取起始/结束编号传入FFmpeg
如果必须使用序列模式(比如需要严格保证编号顺序),可以通过批处理提取图片文件名中的数字,排序后得到起始和结束编号:
完整修改后的批处理脚本
@echo off setlocal enabledelayedexpansion rem 遍历监控文件夹下的子文件夹 for /f "tokens=*" %%a in ('dir "Y:\fastone_timelapse" /B /AD') do ( set "new_folder=%%a" set "img_dir=Y:\ft\!new_folder!" rem 检查是否存在jpg文件 if exist "!img_dir!\*.jpg" ( rem 初始化起始和结束编号 set "start_num=" set "end_num=" rem 遍历所有jpg文件,提取文件名中的数字 for /f "tokens=*" %%f in ('dir "!img_dir!\*.jpg" /B /O:N') do ( rem 提取文件名中的数字部分(假设文件名仅包含数字和.jpg后缀) set "fname=%%~nf" rem 判断是否为纯数字文件名 echo !fname! | findstr /r "^[0-9][0-9]*$" >nul if !errorlevel! equ 0 ( rem 初始化起始编号 if not defined start_num set "start_num=!fname!" rem 更新结束编号为当前更大的数字 if !fname! gtr !end_num! set "end_num=!fname!" ) ) rem 如果成功获取到编号,执行FFmpeg命令 if defined start_num if defined end_num ( ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number !start_num! -i "!img_dir!\%%05d.jpg" -c:v libx265 -b:v 5000k -g 100 "Y:\ft\!new_folder!.mp4" ) ) ) endlocal
说明:脚本会自动提取纯数字文件名的最小/最大值作为起始/结束编号,确保FFmpeg能正确识别序列。如果文件名包含非数字字符,可根据实际情况调整数字提取逻辑。
内容的提问来源于stack exchange,提问作者getho
相关产品推荐
相关产品推荐

