如何用FFmpeg批量处理同名配对的视频与字幕文件?
批量给匹配的视频文件添加字幕的解决方案
我来帮你搞定这个批量处理的问题!针对你这种文件名完全匹配的视频和字幕文件,我们不用一个个手动敲ffmpeg命令,用脚本就能自动搞定所有文件。下面分不同操作系统给你详细步骤:
Windows 系统(批处理脚本)
- 把所有需要处理的视频文件(比如
.avi、.mkv)和对应的字幕文件(.srt、.ass)放到同一个文件夹里。 - 新建一个文本文件,把它的后缀名改成
.bat(比如命名为add_subtitles.bat)。 - 右键编辑这个bat文件,粘贴下面的代码:
@echo off setlocal enabledelayedexpansion :: 遍历当前文件夹下的avi和mkv文件,可按需添加.mp4等其他格式 for %%f in (*.avi *.mkv) do ( :: 提取不带扩展名的文件名 set "filename=%%~nf" :: 优先检查ass字幕,再检查srt(顺序可调整) if exist "!filename!.ass" ( echo 正在处理: %%f ffmpeg -i "%%f" -vf subtitles="!filename!.ass" "output_%%f" ) else if exist "!filename!.srt" ( echo 正在处理: %%f ffmpeg -i "%%f" -vf subtitles="!filename!.srt" "output_%%f" ) else ( echo 未找到%%f对应的字幕文件,跳过处理 ) ) echo 所有文件处理完成! pause
- 保存后双击运行这个bat文件就行。脚本会自动给每个找到对应字幕的视频嵌入字幕,输出文件会带
output_前缀,避免覆盖原文件。
Linux/macOS 系统(Shell脚本)
- 同样把视频和字幕放到同一个文件夹,打开终端并进入这个文件夹。
- 新建一个脚本文件:
touch add_subtitles.sh
- 用编辑器打开脚本(比如nano):
nano add_subtitles.sh
- 粘贴下面的代码:
#!/bin/bash # 遍历当前文件夹下的avi和mkv视频文件,可添加.mp4等格式 for video in *.avi *.mkv; do # 跳过非文件的情况(比如没有匹配到文件时) [ -f "$video" ] || continue # 提取不带扩展名的文件名 filename="${video%.*}" # 检查对应字幕文件 if [ -f "$filename.ass" ]; then echo "正在处理: $video" ffmpeg -i "$video" -vf subtitles="$filename.ass" "output_$video" elif [ -f "$filename.srt" ]; then echo "正在处理: $video" ffmpeg -i "$video" -vf subtitles="$filename.srt" "output_$video" else echo "未找到$video对应的字幕文件,跳过" fi done echo 所有处理完成!
- 保存退出(nano里按
Ctrl+O,回车,再按Ctrl+X),然后给脚本加执行权限:
chmod +x add_subtitles.sh
- 运行脚本:
./add_subtitles.sh
针对特定编号范围的进阶处理
如果只想处理某个编号区间的文件(比如例子里的72集到某个集数),可以用更精准的脚本。以Linux/macOS为例,假设文件名格式是[AnimeRG] Naruto Shippuden - XXX [720p] [x265] [pseudo].mkv,处理72到100集的脚本如下:
#!/bin/bash # 设置要处理的起始和结束编号 start=72 end=100 for num in $(seq $start $end); do # 把编号格式化为两位数(如果是三位数就改成%03d) formatted_num=$(printf "%02d" $num) # 拼接完整的视频和字幕文件名 video="[AnimeRG] Naruto Shippuden - $formatted_num [720p] [x265] [pseudo].mkv" subtitle="[AnimeRG] Naruto Shippuden - $formatted_num [720p] [x265] [pseudo].ass" if [ -f "$video" ] && [ -f "$subtitle" ]; then echo "正在处理第$formatted_num集..." ffmpeg -i "$video" -vf subtitles="$subtitle" "output_$video" else echo "第$formatted_num集的视频或字幕文件缺失,跳过" fi done echo 指定区间处理完成!
Windows的话可以用类似的思路,用for /l循环生成编号:
@echo off setlocal enabledelayedexpansion set start=72 set end=100 for /l %%n in (%start%,1,%end%) do ( set "num=0%%n" set "formatted_num=!num:~-2!" set "video=[AnimeRG] Naruto Shippuden - !formatted_num! [720p] [x265] [pseudo].mkv" set "subtitle=[AnimeRG] Naruto Shippuden - !formatted_num! [720p] [x265] [pseudo].ass" if exist "!video!" if exist "!subtitle!" ( echo 正在处理第!formatted_num!集... ffmpeg -i "!video!" -vf subtitles="!subtitle!" "output_!video!" ) else ( echo 第!formatted_num!集文件缺失,跳过 ) ) echo 指定区间处理完成! pause
注意事项
- 确保你的电脑已经安装了ffmpeg,并且能在命令行直接调用。如果不行,需要把ffmpeg的路径加入系统环境变量,或者在脚本里写ffmpeg的完整路径(比如Windows里
C:\ffmpeg\bin\ffmpeg.exe)。 - 一定要保证视频和字幕的文件名完全一致,只有扩展名不同,否则脚本会匹配不到。
内容的提问来源于stack exchange,提问作者croakouttatune
相关产品推荐
相关产品推荐

