FFmpeg命令在CMD/PowerShell中可正常执行,但保存为批处理文件后运行失败
你是不是遇到了这种情况:把FFmpeg命令直接粘贴到CMD或者PowerShell里运行完全正常,但存成.bat或.cmd批处理文件双击运行就报错?
先看看你遇到的错误提示:
[image2 @ 0000019fc1833c40] The specified filename 'C:\Users\sohba\Downloads\0ffmpeg\t1\frameC:\Users\sohba\Downloads\0ffmpeg\camera1.bat3d.jpg' does not contain an image sequence pattern or a pattern is invalid.
[image2 @ 0000019fc1833c40] Use a pattern such as %03d for an image sequence or use the -update option (with -frames:v 1 if needed) to write a single image.
[image2 @ 0000019fc1833c40] Could not open file : C:\Users\sohba\Downloads\0ffmpeg\t1\frameC:\Users\sohba\Downloads\0ff...
问题原因
这是因为批处理脚本里的%是特殊字符,它会被批处理解释器当成变量标识符来解析。比如你原来命令里的%03d,在批处理中%0代表当前脚本的文件名,所以就被替换成了camera1.bat,最终变成了framecamera1.bat3d.jpg,这显然不是你想要的文件名格式,自然就报错了。
解决办法
把命令里所有的单个%改成两个%%,这样批处理解释器就会把%%解析成单个%传递给FFmpeg。修改后的完整批处理代码如下:
@echo off C:\Users\sohba\Downloads\0ffmpeg\bin\ffmpeg -f dshow -i video="CC1" -vf "fps=0.5,drawtext=fontfile=/Windows/Fonts/Arial.ttf:text='%%{localtime}':x=(w-tw)/2:y=h-(2*lh):fontcolor=white:box=1:boxcolor=0x00000000@1:fontsize=30" -q:v 2 -t 9 "C:\Users\sohba\Downloads\0ffmpeg\t1\frame%%03d.jpg"
具体修改了这两处:
- 把
%{localtime}改成%%{localtime},确保FFmpeg能正确识别时间变量 - 把
%03d改成%%03d,保证文件名序列格式正确
现在双击修改后的批处理文件,应该就能正常运行啦!
备注:内容来源于stack exchange,提问作者John

