本文目录导读:

- 方法一:使用 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则提供最底层的控制。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播