本文目录导读:

- 方法一:使用 pydub(最简单)
- 方法二:使用 librosa(适合音频分析)
- 方法三:使用 ffmpeg-python(直接调用ffmpeg)
- 方法四:音频参数调整
- 完整实用案例:音频转换工具
- 常见问题解决
我来为你介绍几种Python转换音频格式的常用方法。
使用 pydub(最简单)
安装依赖
pip install pydub # 还需要安装 ffmpeg # Windows: 下载ffmpeg并添加到环境变量 # Mac: brew install ffmpeg # Linux: sudo apt-get install ffmpeg
基本转换案例
from pydub import AudioSegment
# 1. MP3转WAV
def mp3_to_wav(input_file, output_file):
audio = AudioSegment.from_mp3(input_file)
audio.export(output_file, format="wav")
print(f"转换完成:{output_file}")
# 2. WAV转MP3
def wav_to_mp3(input_file, output_file, bitrate="192k"):
audio = AudioSegment.from_wav(input_file)
audio.export(output_file, format="mp3", bitrate=bitrate)
print(f"转换完成:{output_file}")
# 3. 通用格式转换(支持多种格式)
def convert_audio(input_file, output_file, format=None):
# 自动识别格式
audio = AudioSegment.from_file(input_file)
# 指定输出格式
if format:
audio.export(output_file, format=format)
else:
# 根据扩展名推断格式
audio.export(output_file)
print(f"转换完成:{output_file}")
# 使用示例
if __name__ == "__main__":
# MP3转WAV
mp3_to_wav("input.mp3", "output.wav")
# WAV转MP3
wav_to_mp3("input.wav", "output.mp3")
# 通用转换
convert_audio("input.flac", "output.mp3", format="mp3")
convert_audio("input.ogg", "output.wav", format="wav")
高级功能:批量转换
import os
from pydub import AudioSegment
from pathlib import Path
def batch_convert_audio(input_dir, output_dir, input_format, output_format):
"""
批量转换音频格式
Args:
input_dir: 输入文件夹路径
output_dir: 输出文件夹路径
input_format: 输入格式(如 "mp3")
output_format: 输出格式(如 "wav")
"""
# 创建输出目录
os.makedirs(output_dir, exist_ok=True)
# 遍历输入文件夹
for file in Path(input_dir).glob(f"*.{input_format}"):
try:
# 读取音频
audio = AudioSegment.from_file(str(file), format=input_format)
# 构建输出文件名
output_file = os.path.join(
output_dir,
f"{file.stem}.{output_format}"
)
# 导出音频
audio.export(output_file, format=output_format)
print(f"转换成功:{file.name} -> {output_file}")
except Exception as e:
print(f"转换失败 {file.name}: {e}")
# 使用示例
batch_convert_audio("mp3_files", "wav_files", "mp3", "wav")
使用 librosa(适合音频分析)
import librosa
import soundfile as sf
def convert_with_librosa(input_file, output_file, target_sr=22050):
"""
使用librosa转换音频格式
Args:
input_file: 输入文件
output_file: 输出文件
target_sr: 目标采样率
"""
# 加载音频
audio, sr = librosa.load(input_file, sr=target_sr)
# 保存音频
sf.write(output_file, audio, target_sr)
print(f"转换完成:{output_file}")
return audio, target_sr
# 使用示例
convert_with_librosa("input.mp3", "output.wav", target_sr=44100)
使用 ffmpeg-python(直接调用ffmpeg)
import ffmpeg
def convert_with_ffmpeg(input_file, output_file, **kwargs):
"""
使用ffmpeg转换音频格式
Args:
input_file: 输入文件
output_file: 输出文件
**kwargs: 额外参数(如 bitrate, sample_rate等)
"""
try:
# 构建ffmpeg命令
stream = ffmpeg.input(input_file)
stream = ffmpeg.output(stream, output_file, **kwargs)
# 执行转换
ffmpeg.run(stream, overwrite_output=True)
print(f"转换完成:{output_file}")
except ffmpeg.Error as e:
print(f"转换失败: {e.stderr.decode()}")
# 使用示例
convert_with_ffmpeg("input.mp3", "output.wav", acodec="pcm_s16le")
convert_with_ffmpeg("input.wav", "output.mp3", audio_bitrate="192k")
convert_with_ffmpeg("input.flac", "output.ogg", acodec="libvorbis")
音频参数调整
from pydub import AudioSegment
def convert_with_parameters(input_file, output_file, **params):
"""
调整参数后转换音频
Args:
input_file: 输入文件
output_file: 输出文件
**params: 可调整的参数
- sample_rate: 采样率
- channels: 声道数 (1=单声道, 2=立体声)
- sample_width: 采样宽度 (1, 2, 4字节)
- bitrate: 比特率 (如 "192k")
"""
audio = AudioSegment.from_file(input_file)
# 调整采样率
if 'sample_rate' in params:
audio = audio.set_frame_rate(params['sample_rate'])
# 调整声道
if 'channels' in params:
if params['channels'] == 1:
audio = audio.set_channels(1) # 转为单声道
elif params['channels'] == 2:
audio = audio.set_channels(2) # 转为立体声
# 调整采样宽度
if 'sample_width' in params:
audio = audio.set_sample_width(params['sample_width'])
# 导出音频
export_params = {}
if 'bitrate' in params:
export_params['bitrate'] = params['bitrate']
audio.export(output_file, format=output_file.split('.')[-1], **export_params)
print(f"转换完成:{output_file}")
# 使用示例
convert_with_parameters(
"input.mp3",
"output.wav",
sample_rate=44100, # CD音质
channels=2, # 立体声
bitrate="320k" # 高比特率
)
完整实用案例:音频转换工具
import os
import argparse
from pydub import AudioSegment
from pathlib import Path
class AudioConverter:
"""音频转换工具类"""
SUPPORTED_FORMATS = ['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a']
def __init__(self, input_dir=".", output_dir="converted"):
self.input_dir = Path(input_dir)
self.output_dir = Path(output_dir)
self.output_dir.mkdir(parents=True, exist_ok=True)
self.conversion_count = 0
self.error_count = 0
def convert_single(self, input_file, output_format, **kwargs):
"""转换单个文件"""
input_path = Path(input_file)
# 构建输出路径
output_path = self.output_dir / f"{input_path.stem}.{output_format}"
try:
# 加载音频
audio = AudioSegment.from_file(str(input_path))
# 应用参数调整
if 'sample_rate' in kwargs:
audio = audio.set_frame_rate(kwargs['sample_rate'])
if 'channels' in kwargs:
audio = audio.set_channels(kwargs['channels'])
# 导出
export_kwargs = {'format': output_format}
if 'bitrate' in kwargs:
export_kwargs['bitrate'] = kwargs['bitrate']
audio.export(str(output_path), **export_kwargs)
self.conversion_count += 1
print(f"✓ 转换成功: {input_path.name} -> {output_path.name}")
return str(output_path)
except Exception as e:
self.error_count += 1
print(f"✗ 转换失败 {input_path.name}: {e}")
return None
def batch_convert(self, input_format, output_format, **kwargs):
"""批量转换"""
print(f"开始批量转换: {input_format} -> {output_format}")
print("-" * 40)
# 查找所有匹配的文件
for file in self.input_dir.glob(f"*.{input_format}"):
self.convert_single(str(file), output_format, **kwargs)
# 显示统计信息
print("-" * 40)
print(f"转换完成! 成功: {self.conversion_count}, 失败: {self.error_count}")
def get_audio_info(self, input_file):
"""获取音频信息"""
audio = AudioSegment.from_file(input_file)
print(f"文件: {input_file}")
print(f"时长: {len(audio)/1000:.2f}秒")
print(f"采样率: {audio.frame_rate}Hz")
print(f"声道数: {audio.channels}")
print(f"采样宽度: {audio.sample_width * 8}bit")
print(f"帧数: {audio.frame_count()}")
return {
'duration': len(audio)/1000,
'sample_rate': audio.frame_rate,
'channels': audio.channels,
'sample_width': audio.sample_width
}
# 命令行接口
def main():
parser = argparse.ArgumentParser(description="音频格式转换工具")
parser.add_argument("input", help="输入文件或文件夹路径")
parser.add_argument("output_format", help="输出格式 (mp3, wav, ogg, flac)")
parser.add_argument("-o", "--output", help="输出目录", default="converted")
parser.add_argument("-r", "--sample-rate", type=int, help="采样率")
parser.add_argument("-c", "--channels", type=int, help="声道数 (1或2)")
parser.add_argument("-b", "--bitrate", help="比特率 (如 192k)")
args = parser.parse_args()
converter = AudioConverter(output_dir=args.output)
# 判断是文件还是目录
if os.path.isfile(args.input):
kwargs = {}
if args.sample_rate:
kwargs['sample_rate'] = args.sample_rate
if args.channels:
kwargs['channels'] = args.channels
if args.bitrate:
kwargs['bitrate'] = args.bitrate
output_path = converter.convert_single(args.input, args.output_format, **kwargs)
if output_path:
print(f"输出文件: {output_path}")
elif os.path.isdir(args.input):
converter.input_dir = Path(args.input)
# 自动检测输入格式
converter.batch_convert('*', args.output_format)
else:
print("错误: 输入路径无效")
if __name__ == "__main__":
# 示例1: 转换单个文件
converter = AudioConverter()
converter.convert_single("input.mp3", "wav", sample_rate=44100)
# 示例2: 批量转换所有mp3文件
converter.batch_convert("mp3", "wav", bitrate="320k")
# 示例3: 获取音频信息
converter.get_audio_info("input.mp3")
常见问题解决
# 1. 处理中文文件名
AudioSegment.converter = "ffmpeg"
AudioSegment.ffmpeg = "ffmpeg"
# 2. 设置临时目录(避免磁盘空间不足)
import tempfile
AudioSegment._strtemp = tempfile.mkdtemp()
# 3. 错误处理
try:
audio = AudioSegment.from_file("corrupted.mp3")
except Exception as e:
print(f"无法读取音频文件: {e}")
# 尝试修复
import subprocess
subprocess.run([
"ffmpeg", "-i", "corrupted.mp3",
"-acodec", "copy",
"fixed.mp3"
])
这些方法可以帮你处理大多数音频格式转换需求,pydub是最简单的选择,librosa适合需要进行音频分析的场景,ffmpeg-python则提供最底层的控制。