本文目录导读:

- 方法1:使用 FFmpeg(最推荐)
- 方法2:使用 Python + pydub
- 方法3:使用 Python + wave(WAV格式专用)
- 方法4:使用 shell 脚本(适用WAV)
- 完整的生产级 Python 脚本
- 使用示例
- 建议
我来介绍几种合并多个音频文件的方法,从简单到灵活。
方法1:使用 FFmpeg(最推荐)
FFmpeg是最强大的音视频处理工具:
方法A:直接合并(同格式)
# 创建一个文件列表 echo file 'audio1.mp3' > filelist.txt echo file 'audio2.mp3' >> filelist.txt echo file 'audio3.mp3' >> filelist.txt # 执行合并 ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp3
方法B:自动处理目录下所有文件
#!/bin/bash
# 批量合并脚本
# 生成文件列表
for f in *.mp3; do
echo "file '$f'" >> filelist.txt
done
# 合并文件
ffmpeg -f concat -safe 0 -i filelist.txt -c copy merged_output.mp3
# 清理临时文件
rm filelist.txt
方法2:使用 Python + pydub
from pydub import AudioSegment
import os
def merge_audios(input_files, output_file):
"""
合并多个音频文件
:param input_files: 音频文件路径列表
:param output_file: 输出文件路径
"""
# 加载第一个音频
combined = AudioSegment.from_file(input_files[0])
# 依次追加其他音频
for audio_file in input_files[1:]:
audio = AudioSegment.from_file(audio_file)
combined += audio
# 导出合并后的音频
combined.export(output_file, format="mp3")
print(f"合并完成:{output_file}")
# 使用示例
if __name__ == "__main__":
# 方式1:手动指定文件
files = [
"chapter1.mp3",
"chapter2.mp3",
"chapter3.mp3"
]
# 方式2:自动获取目录下所有mp3
# files = [f for f in os.listdir('.') if f.endswith('.mp3')]
# files.sort() # 按文件名排序
merge_audios(files, "合并版.mp3")
方法3:使用 Python + wave(WAV格式专用)
import wave
import os
def merge_wav_files(input_files, output_file):
"""
合并WAV文件(保持相同参数)
"""
# 读取第一个文件获取参数
with wave.open(input_files[0], 'rb') as first:
params = first.getparams()
# 创建输出文件
with wave.open(output_file, 'wb') as output:
output.setparams(params)
# 逐帧写入所有音频数据
for audio_file in input_files:
with wave.open(audio_file, 'rb') as wav:
output.writeframes(wav.readframes(wav.getnframes()))
print(f"合并完成:{output_file}")
# 使用示例
merge_wav_files(['file1.wav', 'file2.wav'], 'merged.wav')
方法4:使用 shell 脚本(适用WAV)
#!/bin/bash
# 合并当前目录下所有WAV文件
output_file="merged_output.wav"
# 创建临时列表
temp_list=$(mktemp)
# 获取所有WAV文件并排序
for f in $(ls *.wav | sort); do
echo "file '$f'" >> "$temp_list"
done
# 使用FFmpeg合并
ffmpeg -f concat -safe 0 -i "$temp_list" -c copy "$output_file"
# 清理
rm "$temp_list"
echo "合并完成: $output_file"
完整的生产级 Python 脚本
#!/usr/bin/env python3
"""
音频合并工具 - 支持多种格式,带进度显示
"""
import os
import sys
from pathlib import Path
from pydub import AudioSegment
import argparse
def merge_audios_with_progress(input_files, output_file, format="mp3"):
"""
带进度显示的音频合并
"""
if not input_files:
print("错误:没有输入文件")
return False
total = len(input_files)
print(f"开始合并 {total} 个音频文件...")
try:
# 加载第一个文件
combined = AudioSegment.from_file(input_files[0])
print(f"[1/{total}] 已加载: {Path(input_files[0]).name}")
# 依次合并
for i, audio_file in enumerate(input_files[1:], 2):
audio = AudioSegment.from_file(audio_file)
combined += audio
print(f"[{i}/{total}] 已追加: {Path(audio_file).name}")
# 导出
print(f"正在导出到: {output_file}")
combined.export(output_file, format=format)
print(f"✅ 合并完成!输出文件: {output_file}")
return True
except Exception as e:
print(f"❌ 错误: {e}")
return False
def main():
parser = argparse.ArgumentParser(description='合并多个音频文件')
parser.add_argument('files', nargs='+', help='要合并的音频文件列表')
parser.add_argument('-o', '--output', default='merged_output.mp3',
help='输出文件名 (默认: merged_output.mp3)')
parser.add_argument('-f', '--format', default='mp3',
help='输出格式 (默认: mp3)')
args = parser.parse_args()
# 检查文件是否存在
files = [f for f in args.files if Path(f).exists()]
if not files:
print("错误:未找到有效的音频文件")
sys.exit(1)
# 执行合并
success = merge_audios_with_progress(files, args.output, args.format)
sys.exit(0 if success else 1)
if __name__ == "__main__":
main()
使用示例
安装依赖
# FFmpeg # macOS: brew install ffmpeg # Ubuntu: sudo apt install ffmpeg # Python库 pip install pydub
运行脚本
# 使用FFmpeg
bash merge_audios.sh
# 使用Python脚本
python merge_audios.py audio1.mp3 audio2.mp3 audio3.mp3 -o combined.mp3
# 批量处理目录下所有mp3
python -c "import glob; from merge_audios import merge_audios; merge_audios(sorted(glob.glob('*.mp3')), 'all_combined.mp3')"
建议
- 最佳实践:推荐使用FFmpeg方法,支持所有格式,性能最好
- 格式统一:确保所有音频格式一致,否则先转换格式
- 文件排序:如需按特定顺序合并,确保文件名包含序号或排序规则
- 备份源文件:合并前建议备份原始文件
选择哪种方法取决于你的具体需求和技术栈,最推荐FFmpeg,简单高效。