这个系列文章我们来介绍一位海外工程师如何探索 FFmpeg Basics 音视频技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,这是第 21 篇:FFmpeg 批处理文件。
—— 来自公众号“关键帧Keyframe”的分享
1、批处理文件的优点
FFmpeg 工具通常用于各种任务,不容易记住不同编解码器的所有参数、过滤器等。将各种命令组合保存到批处理文件中,可以优化工作并将开发提升到一个新的水平。批处理文件是带有 .bat 扩展名的文本文件,在 Windows 操作系统上主要用于管理任务。它们包含按顺序处理的命令,可以打印各种消息、请求输入等。
将以下文本保存到文件 test.bat中,并通过以下命令调用,其中 filename是您希望查看其属性的媒体文件(命令中的 .bat 扩展名是可选的):
test.bat filename 或 test filename
2、批处理文件的命令
可以使用 command help或 help来显示可用的 Windows 控制台命令。其中一些是特定于批处理文件的。这些和其他命令在下表中描述:
2.1、基本批处理文件命令
| @ | 在行开始时使用,使命令在执行时不显示。例如:@echo off |
|---|---|
| %n(n 是自然数) | 用于获取命令行参数。例如:批处理文件 greeting.bat包含两行代码:@echo offGood %1, %2如果使用命令 greeting day friends调用,则显示结果为:Good day, friends |
| :label | GOTO命令的起始点,用于更改处理顺序。例如:第 1-10 行包含各种命令 :NewItem 第 12-16 行包含各种命令 GOTO NewItem 当处理流到达第 17 行时, GOTO命令将其发送回 NewItem 标签,并从第 12 行继续处理 |
| CALL | 语法:Call [drive][path] filename [batch parameters]用于调用另一个批处理文件,并在调用文件的下一行继续处理。如果被调用的文件不存在,则显示错误消息 |
| CHOICE | 暂停处理并等待用户选择一个选项,通常是“是”或“否”。 语法: CHOICE [/C[: ]choices] [/N] [/S] [/T[: ]c,nn] [text]/C[: ]choices指定允许的键。默认是 YN/N在提示字符串末尾不显示 choices 和 ?/S将选择键视为区分大小写/T[: ]c,nn在 秒后默认选择 c,同时显示文本提示字符串 |
| CLS | 清除屏幕,控制台输出从顶部继续 |
| ECHO | 语法:`ECHO [ON |
| FOR | 在一组文件中为每个文件运行指定的命令 语法: FOR %%variable IN (set) DO command [command-line settings]%%variable指定一个可替换的参数,其值由命令使用。(set)指定一个或多个文件,可以使用通配符,例如 (_.doc)command指定为每个文件执行的命令。command-parameters指定命令的参数或开关。示例命令显示所有 TXT 文件(在批处理文件中使用 %%f,在 cmd 命令行中使用 %f): FOR %%F IN (_.txt) DO type %%F |
| GOTO label | 将处理重定向到指定的标签,请参见上面的 :label 示例 |
| IF | IF [NOT] ERRORLEVEL 数字 命令IF [NOT] string1==string2 命令IF [NOT] EXIST 文件名 命令NOT指定只有在条件为假时,DOS 才执行命令ERRORLEVEL如果最后一个程序运行返回的退出码等于或大于指定的数字,则指定一个真实的条件command指定在条件满足时执行的命令string1==string2如果指定的文本字符串匹配,则指定一个真实的条件EXIST如果指定的文件名存在,则指定一个真实的条件IF命令指定条件处理 |
| PAUSE | 暂停处理并显示消息:“按任意键继续…” |
| REM | 语法:REM [command]用于添加描述和其他信息,在处理过程中不使用 |
| SHIFT | 语法:SHIFT [n](n 是自然数)用于移动命令行参数的位置,并在批处理文件中使用 %1、%2 等。例如,批处理文件 shift.bat: @ECHO OFFECHO %1SHIFTECHO %1现在,当启动此文件时,结果为: First First |
| START | START ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED][/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL][/WAIT] [/B] [command/program][parameters]为指定的命令启动一个新窗口。要查看所有选项的描述,请输入 help start |
3、批处理文件的典型用法
- 便携设备的视频转换
- 将各种格式的音频转换为 MP3 文件,用于 MP3 播放器
- 降低在网络上使用的帧大小和比特率
批处理文件用于经常重复的音频和视频处理任务。例如,我们可以在桌面上放置一个名为 yt2mp3 的快捷方式,该文件位于目录 C:\media 中,用于将从 YouTube 下载的视频转换为 MP3 格式。yt2mp3.bat 文件包含以下内容:

转换成功后,ffplay 开始播放生成的 MP3 文件。
4、音频发生器
ToneGenerator.bat 是一个生成指定音调和持续时间音调的批处理文件。为了区分同一音高的两个音调,每个音调都加入了 silence.mp3,持续时间为 0.2 秒。如果计划加快速度,可以将其设置为 0.3 秒或更长。命令如下:
ffmpeg -f lavfi -i aevalsrc=0 -t 0.2 silence.mp3
ToneGenerator.bat 文件的内容如下(为方便解释添加了行号,实际文件中没有行号):
1 @echo off
2 set /p n=Please enter the note name:
3 set /p f=Please enter the frequency:
4 set /p d=Please enter the duration in seconds:
5 ffmpeg -f lavfi -i aevalsrc=sin(%f%*2*PI*t) -t %d% tone%n%_%d%.mp3
6 copy /b tone%n%%d%.mp3+silence.mp3 tone%n%_%d%.mp3
对特定命令行的解释(如果音调单独使用,可以跳过添加 silence 的步骤):
- 1:命令
@echo off在批处理文件处理过程中停止显示命令内容,@符号也防止显示此命令。 - 2:命令
set /p variable_name=text创建一个变量,在处理期间显示一行文本并等待输入键的输入结束。字符串 “Please enter the note name: ” 显示后,按下 Enter 键将创建一个新变量n并包含输入的值。 - 3:与第 2 行类似,创建一个包含输入频率的变量
f。 - 4:与第 2 行类似,创建一个包含音调持续时间(秒)的变量
d。 - 5:FFmpeg 使用 lavfi(libavfilter 虚拟输入设备)和 aevalsrc 音频输入设备,根据变量
d设置的持续时间生成由变量f指定频率的声音。输出 MP3 文件的名称结合了音符名称和持续时间。 - 6:使用复制命令的
/b选项(指定二进制模式)将生成的文件附加一个 0.2 秒长的短 MP3 文件,最终文件名为 “tone+ 音符名称 +_持续时间 +.mp3”,例如,对于 A4 音符,持续时间为 1 秒,则文件名为 noteA4_1.mp3。
5、创建《Jingle Bells》
《Jingle Bells》是一首非常流行的冬季恋歌,其副歌部分只有 5 个音符,尽管有些音符的持续时间较长。下图显示了这段文字的顺序:

现在我们使用 ToneGenerator.bat 生成 9 种不同的音调:
- E4,频率 329.63 Hz,持续时间 1 秒 – 文件 E_1.mp3。
- E4,频率 329.63 Hz,持续时间 2 秒 – 文件 E_2.mp3。
- E4,频率 329.63 Hz,持续时间 4 秒 – 文件 E_4.mp3。
- G4,频率 392.00 Hz,持续时间 1 秒 – 文件 G_1.mp3。
- G4,频率 392.00 Hz,持续时间 2 秒 – 文件 G_2.mp3。
- C4,频率 261.63 Hz,持续时间 1 秒 – 文件 C_1.mp3。
- D4,频率 293.66 Hz,持续时间 1 秒 – 文件 D_1.mp3。
- D4,频率 293.66 Hz,持续时间 2 秒 – 文件 D_2.mp3。
- F4,频率 349.23 Hz,持续时间 1 秒 – 文件 F_1.mp3。
文件名中省略了八度音阶 4。第一行和第二行的音调可以使用以下两个命令连接,第三个命令将这两行连接起来:
copy /b E_1.mp3+E_1.mp3+E_2.mp3+E_1.mp3+E_1.mp3+E_2.mp3+E_1.mp3+^ G_1.mp3D+C_1.mp3+D_1.mp3+E_4.mp3 line1.mp3
copy /b F_1.mp3+F_1.mp3+F_1.mp3+F_1.mp3+F_1.mp3+E_1.mp3+E_2.mp3+^ E_1.mp3D+D_1.mp3+D_1.mp3+E_1.mp3+D_2.mp3+G_2.mp3 line2.mp3
copy /b line1.mp3+line2.mp3 refrain.mp3
另一种方法是修改 ToneGenerator.bat 文件以生成编号的文件名,然后立即附加一个批处理文件。以下是修订版的 ToneGenerator.bat 文件,可用于生成 24 个 MP3 文件,文件名为 tone01.mp3、tone02.mp3、…、tone24.mp3:
@echo off
echo 如果音符数量超过 9 个,请从 0 开始编号。
set /p n=请输入音符编号:
set /p f=请输入频率:
set /p d=请输入持续时间(秒):
ffmpeg -f lavfi -i aevalsrc=sin(%f%*2*PI*t) -t %d% %n%.mp3
copy /b %n%.mp3+silence.mp3 tone%n%.mp3
现在我们可以通过 FileJoiner.bat 将所有 24 个 MP3 文件连接起来,其内容如下:
@echo off
copy /y nul output >nul
set /p t=请输入文件类型:
for %%f in (*.%t%) do copy /b output+%%f output
ren output output.%t%
- 第 2 行创建一个空文件,作为从目录复制第一个文件的初始文件。
- 第 3 行请求文件扩展名并将其存储在变量
t中,将要连接的是这些扩展名的文件。 - 第 4 行使用 for 循环将文件按顺序复制到文件 output 中。
- 第 5 行为文件 output 增加扩展名。
两种方法生成的副歌都比原曲慢。可以使用 atempo 过滤器来调整速度:
ffmpeg -i output.mp3 -af atempo=2 refrain.mp3
atempo 过滤器可以多次应用,详细信息请参阅时间操作章节。
6、简化转换
编写 Codec 的章节介绍了如何使用预设文件简化转换。如果您经常使用各种预设转换媒体,那么请求特定预设的批处理文件可能很有用。一个名为 Conversion.bat 的简单批处理文件示例如下:

请参阅前面的章节以描述第 1-7 行。
- 第 8 行使用 IF 构造选择带或不带预设的转换。如果变量
p为 0,则由于 GOTO 命令,处理将继续到 NOPRESET 标签。 - 如果指定了预设文件,第 9 行将转换输入。
- 第 10 行终止处理,因此跳过第 12 行中的转换。
- 第 12 行使用可选的附加参数将输入转换为没有预设的文件。
Conversion.bat 文件可以在许多方面进行修改,例如包括过滤器、更多输入等。
音视频方向学习、求职,欢迎加入我们的星球
丰富的音视频知识、面试题、技术方案干货分享,还可以进行面试辅导

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。