cd %cd%
ffmpeg -i %cd%/%04d.png out.mp4
只有这个的脚本工作完全正常,并输出我需要它,但:
:: A simple script to convert a png or jpg image sequence to an
mp4 file with ffmpeg
cls
@echo off
title PNG2MP4
color C
echo Ensure you have ffmpeg installed and setup in your environment variables or this script won't work.
:QUERY
echo This will convert all image files in the following directory to a single mp4,
echo %cd%
echo are the files PNGs or JPEGs(PNG/P/JPG/J/CANCEL)?
set/p "ch=>"
if /I %ch%==PNG goto CONVERTPNG
if /I %ch%==P goto CONVERTPNG
if /I %ch%==JPG goto CONVERTJPG
if /I %ch%==J goto CONVERTJPG
if /I %ch%==CANCEL goto :eof
echo Invalid choice & goto QUERY
:CONVERTPNG
cd %cd%
ffmpeg -i %cd%/%04d.png out.mp4
:CONVERTJPG
cd %cd%
ffmpeg -i %cd%/%04d.jpg out.mp4
这个更复杂的脚本版本失败了,输出:
C:\tmp/img2mp4.bat4d.jpg: No such file or directory
为什么它不再调用它以前执行的文件,并且有一个简单的解决方法吗?
以下是我对批处理文件的建议:
@echo off
rem A simple script to convert a png or jpg image sequence to an mp4 file with ffmpeg
cls
title PNG2MP4
color C
echo Ensure you have ffmpeg installed and setup in your environment variables
echo or this script won't work.
echo/
echo This will convert all image files in the following directory to a single mp4:
echo/
echo %cd%
echo/
%SystemRoot%\System32\choice.exe /C PJC /N /M "Are the files PNGs or JPEGs or Cancel (P/J/C)? "
if errorlevel 3 color & goto :EOF
echo/
if errorlevel 2 (
ffmpeg.exe -i %%04d.jpg out.mp4
) else (
ffmpeg.exe -i %%04d.png out.mp4
)
color
字符%
必须在一个批处理文件中转义,其中一个%
被解释为文字字符,这是导致批处理文件无法按预期工作的主要问题。 %0
引用用于启动批处理文件的字符串,即img2mp4.bat
。所以%04d.jpg
导致img2mp4.bat
与4d.jpg
连接,结果运行ffmpeg.exe
与img2mp4.bat4d.jpg
作为文件名而不是参数字符串%04d.jpg
。
要引用当前目录中的一个或多个文件/文件夹,可以在没有路径的脚本或应用程序的参数列表中简单地指定文件/文件夹。微软有关Naming Files, Paths, and Namespaces的文章对此进行了解释。本文进一步描述了在Windows上,目录分隔符是反斜杠字符\
,而不是Linux和Mac上的正斜杠/
。在Windows上使用/
主要用于选项,因为它可以在命令CHOICE上看到,因为文件/文件夹名称中不能使用此字符。 -
在Linux / Mac上用于选项,即使作为文件/文件夹名称的第一个字符,也可以在文件/文件夹名称中使用。因此,在Windows上,\
应该始终用作目录分隔符,尽管用于文件系统访问的Windows内核函数会自动将文件/文件夹名称中的/
更正为\
。
对于提示用户使用选项/P
从多个提供的选项中做出选择,CHOICE要好得多。 set/p
在语法上根本不正确,因为命令是set
,用选项/P
中的空格分隔,用下一个参数variable=prompt text
中的空格分隔。 set/p
迫使cmd.exe
自动纠正命令行到set /p
。批处理文件应在语法上正确编码,而不依赖于Windows命令处理器的自动更正。
要了解使用的命令及其工作方式,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
call /?
...解释了如何引用批处理文件参数。echo /?
rem /?
cls /?
title /?
color /?
set /?
choice /?
if /?
goto /?
进一步我建议阅读: