本文目录导读:

我来介绍几种批量混合音频声道的方法,主要使用FFmpeg和Python脚本。
使用FFmpeg批处理脚本
Windows (Batch脚本)
@echo off
setlocal enabledelayedexpansion
REM 设置输入输出文件夹
set INPUT_DIR=.\input
set OUTPUT_DIR=.\output
REM 创建输出文件夹
if not exist %OUTPUT_DIR% mkdir %OUTPUT_DIR%
REM 循环处理所有音频文件
for %%f in ("%INPUT_DIR%\*.mp3" "%INPUT_DIR%\*.wav" "%INPUT_DIR%\*.flac") do (
set INPUT_FILE=%%f
set FILENAME=%%~nf
set EXT=%%~xf
echo 正在处理: %%~nxf
REM 将立体声混合为单声道
ffmpeg -i "%%f" -ac 1 "%OUTPUT_DIR%\!FILENAME!_mono!EXT!"
REM 或者自定义混合比例(左声道70% + 右声道30%)
REM ffmpeg -i "%%f" -af "pan=mono|c0=0.7*c0+0.3*c1" "%OUTPUT_DIR%\!FILENAME!_mixed!EXT!"
)
echo 处理完成!
pause
Linux/macOS (Bash脚本)
#!/bin/bash
INPUT_DIR="./input"
OUTPUT_DIR="./output"
# 创建输出目录
mkdir -p "$OUTPUT_DIR"
# 处理所有音频文件
for file in "$INPUT_DIR"/*.{mp3,wav,flac,m4a}; do
if [ -f "$file" ]; then
filename=$(basename "$file")
name="${filename%.*}"
ext="${filename##*.}"
echo "处理: $filename"
# 混合为单声道
ffmpeg -i "$file" -ac 1 "$OUTPUT_DIR/${name}_mono.$ext"
# 或者自定义混合
# ffmpeg -i "$file" -af "pan=mono|c0=0.6*c0+0.4*c1" "$OUTPUT_DIR/${name}_mixed.$ext"
fi
done
echo "处理完成!"
Python脚本(更灵活)
import os
import subprocess
from pathlib import Path
def batch_mix_channels(input_dir, output_dir, method='average'):
"""
批量混合音频声道
参数:
input_dir: 输入文件夹路径
output_dir: 输出文件夹路径
method: 混合方法
'average' - 平均混合
'left' - 仅左声道
'right' - 仅右声道
'custom' - 自定义比例
"""
# 创建输出目录
Path(output_dir).mkdir(parents=True, exist_ok=True)
# 支持的音频格式
audio_extensions = ['.mp3', '.wav', '.flac', '.m4a', '.ogg', '.wma']
# 遍历输入目录
for file in Path(input_dir).iterdir():
if file.suffix.lower() in audio_extensions:
input_path = str(file)
output_path = os.path.join(output_dir, f"{file.stem}_mixed{file.suffix}")
print(f"处理: {file.name}")
# 根据方法选择FFmpeg参数
if method == 'average':
# 平均混合(默认)
filter_cmd = "-ac 1"
elif method == 'left':
filter_cmd = '-af "pan=mono|c0=c0"'
elif method == 'right':
filter_cmd = '-af "pan=mono|c0=c1"'
elif method == 'custom':
# 自定义比例(左60%,右40%)
filter_cmd = '-af "pan=mono|c0=0.6*c0+0.4*c1"'
# 执行FFmpeg命令
cmd = f'ffmpeg -i "{input_path}" {filter_cmd} -y "{output_path}"'
try:
subprocess.run(cmd, shell=True, check=True,
capture_output=True, text=True)
print(f" ✓ 完成: {file.name}")
except subprocess.CalledProcessError as e:
print(f" ✗ 失败: {file.name}")
print(f" 错误: {e.stderr}")
# 使用示例
if __name__ == "__main__":
# 设置输入输出目录
input_folder = "./input_audio"
output_folder = "./output_audio"
# 执行批量处理
batch_mix_channels(input_folder, output_folder, method='average')
高级Python脚本(带参数控制)
import os
import subprocess
from pathlib import Path
import argparse
import concurrent.futures
class AudioChannelMixer:
def __init__(self, input_dir, output_dir, left_ratio=0.5, right_ratio=0.5,
format='same', threads=4):
"""
初始化音频声道混合器
参数:
input_dir: 输入目录
output_dir: 输出目录
left_ratio: 左声道比例 (0-1)
right_ratio: 右声道比例 (0-1)
format: 输出格式 ('same' 保持原格式, 'wav', 'mp3'等)
threads: 并行处理线程数
"""
self.input_dir = Path(input_dir)
self.output_dir = Path(output_dir)
self.left_ratio = left_ratio
self.right_ratio = right_ratio
self.format = format
self.threads = threads
# 创建输出目录
self.output_dir.mkdir(parents=True, exist_ok=True)
def process_file(self, file_path):
"""处理单个音频文件"""
input_path = str(file_path)
# 确定输出格式
if self.format == 'same':
output_ext = file_path.suffix
else:
output_ext = f'.{self.format}'
# 构建输出文件名
output_name = f"{file_path.stem}_mixed_L{self.left_ratio}_R{self.right_ratio}{output_ext}"
output_path = str(self.output_dir / output_name)
# 构建FFmpeg命令
filter_str = f"pan=mono|c0={self.left_ratio}*c0+{self.right_ratio}*c1"
cmd = [
'ffmpeg',
'-i', input_path,
'-af', filter_str,
'-y', # 覆盖已存在的文件
output_path
]
try:
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
return True, file_path.name, output_name
except subprocess.CalledProcessError:
return False, file_path.name, result.stderr
def run_batch(self):
"""执行批量处理"""
# 收集所有音频文件
audio_files = []
for ext in ['.mp3', '.wav', '.flac', '.m4a', '.ogg', '.aac', '.wma']:
audio_files.extend(self.input_dir.glob(f'*{ext}'))
if not audio_files:
print("未找到音频文件!")
return
print(f"找到 {len(audio_files)} 个音频文件")
print(f"混合比例 - 左声道: {self.left_ratio}, 右声道: {self.right_ratio}")
print("-" * 50)
# 使用线程池并行处理
with concurrent.futures.ThreadPoolExecutor(max_workers=self.threads) as executor:
futures = {executor.submit(self.process_file, file): file for file in audio_files}
success_count = 0
fail_count = 0
for future in concurrent.futures.as_completed(futures):
file = futures[future]
try:
success, name, result = future.result()
if success:
print(f"✓ 处理成功: {name} -> {result}")
success_count += 1
else:
print(f"✗ 处理失败: {name}")
print(f" 错误: {result}")
fail_count += 1
except Exception as e:
print(f"✗ 处理异常: {file.name} - {str(e)}")
fail_count += 1
print("-" * 50)
print(f"处理完成! 成功: {success_count}, 失败: {fail_count}")
# 命令行接口
def main():
parser = argparse.ArgumentParser(description='批量混合音频声道')
parser.add_argument('-i', '--input', required=True, help='输入文件夹路径')
parser.add_argument('-o', '--output', default='./output', help='输出文件夹路径')
parser.add_argument('-l', '--left', type=float, default=0.5,
help='左声道音量比例 (0-1),默认0.5')
parser.add_argument('-r', '--right', type=float, default=0.5,
help='右声道音量比例 (0-1),默认0.5')
parser.add_argument('-f', '--format', default='same',
help='输出格式 (same/wav/mp3/flac)')
parser.add_argument('-t', '--threads', type=int, default=4,
help='并行处理线程数')
args = parser.parse_args()
# 验证参数
if not (0 <= args.left <= 1 and 0 <= args.right <= 1):
print("错误:声道比例必须在0-1之间")
return
# 创建混合器并执行
mixer = AudioChannelMixer(
input_dir=args.input,
output_dir=args.output,
left_ratio=args.left,
right_ratio=args.right,
format=args.format,
threads=args.threads
)
mixer.run_batch()
if __name__ == "__main__":
# 使用命令行参数执行
# main()
# 或者直接设置参数执行
mixer = AudioChannelMixer(
input_dir="./input_audio",
output_dir="./output_audio",
left_ratio=0.7, # 左声道70%
right_ratio=0.3, # 右声道30%
format='same', # 保持原格式
threads=4 # 4个线程并行处理
)
mixer.run_batch()
使用示例
命令行使用(高级版本):
python mixer.py -i "./input" -o "./output" -l 0.6 -r 0.4 -f mp3 -t 4
常见混合场景:
-
立体声转单声道(平均混合):
左声道:0.5,右声道:0.5
-
保留左声道:
左声道:1.0,右声道:0.0
-
增强中间声道:
左声道:0.7,右声道:0.7
-
左右声道不同比例:
左声道:0.8,右声道:0.2(突出左声道)
注意事项
- 安装FFmpeg:确保系统中已安装FFmpeg
- 备份原文件:建议先备份重要文件
- 测试先:先用1-2个文件测试效果
- 音频质量:混合后音量可能会变化,可根据需要调整
- 格式兼容性:某些格式可能不支持直接覆盖,建议使用WAV作为中间格式
这些脚本可以满足大多数批量混合音频声道的需求,根据具体情况选择合适的版本使用。