怎样用脚本批量混合音频声道?

wen 实用脚本 1

本文目录导读:

怎样用脚本批量混合音频声道?

  1. 方法一:使用FFmpeg批处理脚本
  2. 方法二:Python脚本(更灵活)
  3. 方法三:高级Python脚本(带参数控制)
  4. 使用示例
  5. 注意事项

我来介绍几种批量混合音频声道的方法,主要使用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

常见混合场景:

  1. 立体声转单声道(平均混合)

    左声道:0.5,右声道:0.5

  2. 保留左声道

    左声道:1.0,右声道:0.0

  3. 增强中间声道

    左声道:0.7,右声道:0.7

  4. 左右声道不同比例

    左声道:0.8,右声道:0.2(突出左声道)

注意事项

  1. 安装FFmpeg:确保系统中已安装FFmpeg
  2. 备份原文件:建议先备份重要文件
  3. 测试先:先用1-2个文件测试效果
  4. 音频质量:混合后音量可能会变化,可根据需要调整
  5. 格式兼容性:某些格式可能不支持直接覆盖,建议使用WAV作为中间格式

这些脚本可以满足大多数批量混合音频声道的需求,根据具体情况选择合适的版本使用。

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