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
为什么它不再调用以前执行过的文件,并且对此有一个简单的解决方法?
答案 0 :(得分:1)
这是我对批处理文件的建议:
@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
的{{1}}。
要引用当前目录中的一个或多个文件/文件夹,可以在没有路径的脚本或应用程序的参数列表中简单地指定文件/文件夹。在Microsoft关于Naming Files, Paths, and Namespaces的文章中对此进行了解释。本文进一步说明,在Windows上,目录分隔符是反斜杠字符%04d.jpg
,而不是Linux和Mac上的正斜杠\
。 /
在Windows上主要用于选项,因为可以在命令 CHOICE 上看到它,因为在文件/文件夹名称中不可能使用此字符。 /
在Linux / Mac上用于选项,这些选项也可以在文件/文件夹名称中使用,甚至可以作为文件/文件夹名称的第一个字符使用。因此,尽管Windows内核用于文件系统访问的功能会自动将文件/文件夹名称中的-
纠正为\
,但在Windows上/
应该始终用作目录分隔符。
\
的 SET 相比, 选择提示用户从多个提供的选项中进行选择要好得多。 /P
在语法上根本不正确,因为命令set/p
与选项set
隔开一个空格,与下一个参数/P
隔开一个空格。 variable=prompt text
强制set/p
自动将命令行更正为cmd.exe
。批处理文件应在语法上正确编码,并且不依赖于Windows命令处理器的自动更正。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
set /p
...说明了如何引用批处理文件参数。call /?
echo /?
rem /?
cls /?
title /?
color /?
set /?
choice /?
if /?
我还建议阅读: