Python音频转换案例如何转换音频格式

wen python案例 22

本文目录导读:

Python音频转换案例如何转换音频格式

  1. 方法一:使用pydub库(推荐,最简单)
  2. 方法二:使用librosa库(适合音频处理)
  3. 方法三:使用ffmpeg(功能最强大)
  4. 完整工具类实现
  5. 注意事项

我来为您介绍Python音频格式转换的几种常用方法:

使用pydub库(推荐,最简单)

安装

pip install pydub

基本转换示例

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")
# 2. WAV转MP3
def wav_to_mp3(input_file, output_file):
    audio = AudioSegment.from_wav(input_file)
    audio.export(output_file, format="mp3", bitrate="192k")
# 3. 通用格式转换
def convert_audio(input_file, output_file):
    audio = AudioSegment.from_file(input_file)
    audio.export(output_file, format=output_file.split('.')[-1])
# 使用示例
mp3_to_wav("input.mp3", "output.wav")
wav_to_mp3("input.wav", "output.mp3")
convert_audio("input.mp3", "output.ogg")

使用librosa库(适合音频处理)

安装

pip install librosa soundfile

转换示例

import librosa
import soundfile as sf
def convert_audio_librosa(input_file, output_file, target_sr=22050):
    """
    转换音频格式
    :param input_file: 输入文件路径
    :param output_file: 输出文件路径
    :param target_sr: 目标采样率
    """
    # 加载音频
    audio, sr = librosa.load(input_file, sr=target_sr)
    # 保存音频
    sf.write(output_file, audio, target_sr)
# 使用示例
convert_audio_librosa("input.mp3", "output.wav")

使用ffmpeg(功能最强大)

安装

pip install ffmpeg-python

转换示例

import ffmpeg
def convert_with_ffmpeg(input_file, output_file, codec=None, bitrate=None):
    """
    使用ffmpeg转换音频
    """
    stream = ffmpeg.input(input_file)
    # 设置编码参数
    if codec:
        stream = ffmpeg.output(stream, output_file, acodec=codec)
    else:
        stream = ffmpeg.output(stream, output_file)
    if bitrate:
        stream = stream.global_args('-b:a', bitrate)
    # 执行转换
    ffmpeg.run(stream)
# 使用示例
convert_with_ffmpeg("input.mp3", "output.wav")
convert_with_ffmpeg("input.wav", "output.mp3", codec='libmp3lame', bitrate='192k')

完整工具类实现

import os
from pydub import AudioSegment
class AudioConverter:
    """音频格式转换工具类"""
    SUPPORTED_FORMATS = ['mp3', 'wav', 'ogg', 'flac', 'aac', 'wma']
    def __init__(self):
        pass
    def convert(self, input_file, output_file, format=None):
        """
        转换音频格式
        :param input_file: 输入文件路径
        :param output_file: 输出文件路径
        :param format: 输出格式(可选,默认从文件扩展名获取)
        """
        # 检查输入文件是否存在
        if not os.path.exists(input_file):
            raise FileNotFoundError(f"输入文件不存在: {input_file}")
        # 获取输出格式
        if format:
            output_format = format
        else:
            output_format = output_file.split('.')[-1]
        # 检查格式支持
        if output_format not in self.SUPPORTED_FORMATS:
            raise ValueError(f"不支持的输出格式: {output_format}")
        # 加载音频
        audio = AudioSegment.from_file(input_file)
        print(f"正在转换: {input_file} -> {output_file}")
        print(f"原始信息: 采样率={audio.frame_rate}Hz, 声道={audio.channels}, 采样大小={audio.sample_width*8}bit")
        # 导出音频
        audio.export(output_file, format=output_format)
        print("转换完成!")
        return True
    def batch_convert(self, input_dir, output_dir, target_format):
        """
        批量转换文件夹中的所有音频
        :param input_dir: 输入文件夹
        :param output_dir: 输出文件夹
        :param target_format: 目标格式
        """
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)
        converted_files = []
        for filename in os.listdir(input_dir):
            if filename.split('.')[-1] in self.SUPPORTED_FORMATS:
                input_path = os.path.join(input_dir, filename)
                output_filename = filename.rsplit('.', 1)[0] + '.' + target_format
                output_path = os.path.join(output_dir, output_filename)
                try:
                    self.convert(input_path, output_path)
                    converted_files.append(output_path)
                except Exception as e:
                    print(f"转换失败 {filename}: {str(e)}")
        return converted_files
    def get_audio_info(self, file_path):
        """获取音频文件信息"""
        audio = AudioSegment.from_file(file_path)
        return {
            'duration': len(audio) / 1000,  # 秒
            'frame_rate': audio.frame_rate,  # 采样率
            'channels': audio.channels,      # 声道数
            'sample_width': audio.sample_width * 8,  # 位深
            'frame_count': audio.frame_count()  # 总帧数
        }
# 使用示例
if __name__ == "__main__":
    converter = AudioConverter()
    # 单个文件转换
    converter.convert("input.mp3", "output.wav")
    converter.convert("input.wav", "output.mp3", format="mp3")
    # 批量转换
    converted = converter.batch_convert("./input_audio", "./output_audio", "wav")
    print(f"成功转换 {len(converted)} 个文件")
    # 获取音频信息
    info = converter.get_audio_info("audio.mp3")
    print(f"音频信息: {info}")

注意事项

  1. 依赖安装:使用pydub需要额外安装ffmpeg:

    • Windows: 下载ffmpeg并添加到系统PATH
    • Mac: brew install ffmpeg
    • Linux: sudo apt-get install ffmpeg
  2. 格式支持:不同的库支持的格式可能不同,pydub支持最广泛的格式

  3. 性能考虑

    • 小文件直接用pydub即可
    • 大文件推荐使用ffmpeg,内存占用更小
  4. 参数调整

    # 调整音频参数示例
    audio = AudioSegment.from_file("input.mp3")
    # 改变采样率
    audio = audio.set_frame_rate(16000)
    # 改变声道数
    audio = audio.set_channels(1)  # 转单声道
    # 调整音量
    audio = audio + 6  # 增加6dB
    # 裁剪音频
    audio = audio[1000:5000]  # 1秒到5秒
    audio.export("output.mp3", format="mp3", bitrate="128k")

选择哪种方法取决于您的具体需求:

  • 简单转换:pydub
  • 音频处理分析:librosa
  • 专业级转换:ffmpeg

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