怎样用脚本合并多个音频文件?

wen 实用脚本 2

本文目录导读:

怎样用脚本合并多个音频文件?

  1. 方法1:使用 FFmpeg(最推荐)
  2. 方法2:使用 Python + pydub
  3. 方法3:使用 Python + wave(WAV格式专用)
  4. 方法4:使用 shell 脚本(适用WAV)
  5. 完整的生产级 Python 脚本
  6. 使用示例
  7. 建议

我来介绍几种合并多个音频文件的方法,从简单到灵活。

方法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')"

建议

  1. 最佳实践:推荐使用FFmpeg方法,支持所有格式,性能最好
  2. 格式统一:确保所有音频格式一致,否则先转换格式
  3. 文件排序:如需按特定顺序合并,确保文件名包含序号或排序规则
  4. 备份源文件:合并前建议备份原始文件

选择哪种方法取决于你的具体需求和技术栈,最推荐FFmpeg,简单高效。

抱歉,评论功能暂时关闭!