使用说明
目录结构要求
项目根目录/
├── 开头/ # 存放所有故事的开头音频
│ ├── 济公传开头_001.mp3
│ └── 西游记开头_001.mp3
├── 正片/ # 存放所有故事的正片音频
│ ├── 济公传_001.mp3
│ └── 西游记_001.mp3
├── 结尾/ # 存放所有故事的结尾音频
│ ├── 济公传结尾_001.mp3
│ └── 西游记结尾_001.mp3
├── 合并开头.sh # 通用开头合并脚本
└── 合并结尾.sh # 通用结尾合并脚本
├── 开头/ # 存放所有故事的开头音频
│ ├── 济公传开头_001.mp3
│ └── 西游记开头_001.mp3
├── 正片/ # 存放所有故事的正片音频
│ ├── 济公传_001.mp3
│ └── 西游记_001.mp3
├── 结尾/ # 存放所有故事的结尾音频
│ ├── 济公传结尾_001.mp3
│ └── 西游记结尾_001.mp3
├── 合并开头.sh # 通用开头合并脚本
└── 合并结尾.sh # 通用结尾合并脚本
使用步骤
- 创建项目根目录,并在其中创建三个子目录:开头、正片、结尾
- 将开头音频放入"开头"目录,命名格式为: [任意名称]_[数字编号].mp3
- 将正片音频放入"正片"目录,命名格式为: [任意名称]_[数字编号].mp3
- 将结尾音频放入"结尾"目录,命名格式为: [任意名称]_[数字编号].mp3
- 将下方提供的脚本下载到项目根目录
- 打开终端,进入项目根目录
- 给脚本添加执行权限:
chmod +x 合并开头.sh 合并结尾.sh - 运行脚本:
./合并开头.sh或./合并结尾.sh - 合并后的文件将生成在"合并结果"目录中
脚本下载
开头合并脚本
将"开头"目录中的音频合并到"正片"目录对应音频的开头
适用于添加报幕开头
结尾合并脚本
将"结尾"目录中的音频合并到"正片"目录对应音频的结尾
适用于添加报幕结尾
脚本特点
完全通用
不依赖特定故事名称,适用于任何项目
智能匹配
通过数字编号自动匹配文件
错误处理
自动跳过无法匹配的文件
中文提示
清晰的操作过程反馈
工作原理可视化
1
遍历文件
脚本自动扫描目录中的音频文件
2
提取编号
从文件名中识别数字编号
3
匹配文件
通过编号匹配对应的开头/结尾和正片
4
合并音频
使用FFmpeg合并音频文件
脚本源码预览
合并开头.sh
#!/bin/bash
# 创建输出目录
mkdir -p "合并结果/开头合并"
# 遍历所有开头文件
for intro_file in 开头/*; do
# 提取文件名(不含路径和扩展名)
base_name=$(basename "$intro_file")
clean_name="${base_name%.*}"
# 尝试从文件名中提取数字部分(支持各种格式)
if [[ $clean_name =~ _([0-9]+)$ ]]; then
num=${BASH_REMATCH[1]}
elif [[ $clean_name =~ ([0-9]+)$ ]]; then
num=${BASH_REMATCH[1]}
else
echo "⚠️ 跳过:$base_name 未找到数字编号"
continue
fi
# 尝试在正片目录中查找匹配文件
story_file=$(find 正片/ -type f -name "*$num.*" | head -1)
if [ -z "$story_file" ]; then
echo "⚠️ 跳过:找不到匹配的正片文件(编号 $num)"
continue
fi
# 准备输出文件名
output_name=$(basename "$story_file")
output_clean="${output_name%.*}"
output_file="合并结果/开头合并/${output_clean}_完整.mp3"
# 执行合并(开头+正片)
ffmpeg -i "$intro_file" -i "$story_file" -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" -y "$output_file" &> /dev/null
echo "✅ 已合并:$base_name + $(basename "$story_file") → $(basename "$output_file")"
done
echo -e "\n🎉 开头合并完成!"
echo "输出目录: $(pwd)/合并结果/开头合并"
read -p "按回车键退出..."
合并结尾.sh
#!/bin/bash
# 创建输出目录
mkdir -p "合并结果/结尾合并"
# 遍历所有正片文件
for story_file in 正片/*; do
# 提取文件名(不含路径和扩展名)
base_name=$(basename "$story_file")
clean_name="${base_name%.*}"
# 尝试从文件名中提取数字部分
if [[ $clean_name =~ _([0-9]+)$ ]]; then
num=${BASH_REMATCH[1]}
elif [[ $clean_name =~ ([0-9]+)$ ]]; then
num=${BASH_REMATCH[1]}
else
echo "⚠️ 跳过:$base_name 未找到数字编号"
continue
fi
# 尝试在结尾目录中查找匹配文件
outro_file=$(find 结尾/ -type f -name "*$num.*" | head -1)
if [ -z "$outro_file" ]; then
echo "⚠️ 跳过:找不到匹配的结尾文件(编号 $num)"
continue
fi
# 准备输出文件名
output_name=$(basename "$story_file")
output_clean="${output_name%.*}"
output_file="合并结果/结尾合并/${output_clean}_完整.mp3"
# 执行合并(正片+结尾)
ffmpeg -i "$story_file" -i "$outro_file" -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" -y "$output_file" &> /dev/null
echo "✅ 已合并:$base_name + $(basename "$outro_file") → $(basename "$output_file")"
done
echo -e "\n🎉 结尾合并完成!"
echo "输出目录: $(pwd)/合并结果/结尾合并"
read -p "按回车键退出..."