bat 和 cmd 命令的语法差异

在 cmd 命令中利用 ffmpeg 将一系列图片转换为一个视频文件的代码通常是这样的:

1
ffmpeg -i path1/foo-%03d.jpg remux.mp4

为了进行更丰富的操作,则通常需要将命令写入一个 bat 文件中,但是 bat 和 cmd 命令的语法有一点小差异
如下,即在通配符%03d.jpg 前加了个%

1
2
3
ffmpeg -i path1/foo-%%03d.jpg remux.mp4
ffmpeg -i path2/foo-%%03d.jpg remux.mp4
ffmpeg -i path3/foo-%%03d.jpg remux.mp4

这是因为bat相比于直接在cmd中输入命令,%会有一个转义的功能,所以需要多加一个%

ffmpeg 批量转换图片为指定格式

本文将提到以下几种指定格式的转换

gif

webm

mp4

REM为注释内容,其中转换为webm命令中
将视频比特率设置为0很重要。如果未指定视频比特率,则默认为较低值,这会导致使用 “约束质量” 模式,会使画质降低。
另外,如果要真无损,那么使用-lossless 1-crf 0选项,在文件大小上会增加一倍多。因为转码过程中,不仅会添加有损视频编码中的正常错误,而且还会在格式尝试保留旧的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@echo off
set /p ext=请输入输出文件扩展名(mp4/gif/webm/...):
del config.txt >nul 2>nul
del palette.png >nul 2>nul
REM 批量获取图片文件并存入文件中,duration为图片之间的间隔时间
for /r . %%a in (*.png,*.jpg) do (
echo file ^'%%~nxa^' >> config.txt
echo duration 0.12 >> config.txt
)
REM -framerate帧率可以不指定
REM -vf图片滤镜
REM -b:v视频比特率
REM -CRF恒定质量模式,从 0(最佳质量)到 63(最小文件大小)
if %ext%==gif (
ffmpeg -f concat -i config.txt -vf palettegen palette.png
ffmpeg -f concat -i config.txt -i palette.png -lavfi paletteuse -framerate 30 remux.%ext% -y
) else if %ext%==webm (
ffmpeg -f concat -i config.txt -b:v 0 -crf 18 -framerate 30 remux.%ext% -y
) else (
ffmpeg -f concat -i config.txt -crf 18 -framerate 30 remux.%ext% -y
)