You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中将MP3音频文件转换为8/24/32位?

解决MP3文件8/24/32位采样宽度转换问题

关于AudioSegment的resample报错问题

你遇到的AttributeError是因为pydub的AudioSegment类并没有名为resample的方法——大概率是你混淆了其他音频库的API。pydub中调整采样宽度的正确方法是set_sample_width(),调整采样率则用set_frame_rate()。

示例代码(适用于8位/16位/32位转换):

from pydub import AudioSegment

# 读取MP3
audio = AudioSegment.from_mp3('audio.mp3')
# 设置采样宽度:1=8位,2=16位,4=32位
audio_8bit = audio.set_sample_width(1)
# 导出为目标MP3
audio_8bit.export('audio_8bit.mp3', format='mp3')

但注意:pydub对24位(采样宽度3)的原生支持有限,直接用set_sample_width(3)可能无法得到预期结果,需要用更可靠的方案。

24位转换及免WAV中转的解决方案

由于Numpy没有原生的24位整数类型,直接转码会丢失精度,这里推荐两种无需来回转WAV的高效方案:

方案1:直接调用ffmpeg(最可靠)

ffmpeg是音频处理的底层工具,pydub本身也依赖它。直接用ffmpeg命令或Python调用subprocess,可直接处理MP3的采样宽度,无需中转WAV。

命令行示例:

# 转24位MP3
ffmpeg -i input.mp3 -sample_fmt s32 -acodec libmp3lame -b:a 320k output_24bit.mp3

# 转8位MP3
ffmpeg -i input.mp3 -sample_fmt s8 -acodec libmp3lame -b:a 128k output_8bit.mp3

# 转32位MP3
ffmpeg -i input.mp3 -sample_fmt s32 -acodec libmp3lame -b:a 320k output_32bit.mp3

解释:-sample_fmt指定采样格式,s8=8位,s16=16位,s32=32位(用于24位转换时,ffmpeg会自动处理为兼容24位的MP3输出)。

Python封装调用:

import subprocess

def convert_mp3_sample_width(input_path, output_path, sample_width):
    # 映射采样宽度到ffmpeg的sample_fmt参数
    sample_fmt_map = {1: 's8', 2: 's16', 3: 's32', 4: 's32'}
    sample_fmt = sample_fmt_map.get(sample_width)
    if not sample_fmt:
        raise ValueError("采样宽度仅支持1(8位)、2(16位)、3(24位)、4(32位)")
    
    cmd = [
        'ffmpeg',
        '-i', input_path,
        '-sample_fmt', sample_fmt,
        '-acodec', 'libmp3lame',
        '-b:a', '320k',  # 可根据需求调整比特率
        output_path
    ]
    subprocess.run(cmd, check=True)

# 调用示例:转换为24位MP3
convert_mp3_sample_width('audio.mp3', 'audio_24bit.mp3', 3)

方案2:使用soundfile库

soundfile支持直接读取MP3(需安装完整的libsndfile依赖),并支持导出24位格式的MP3:

import soundfile as sf

def convert_mp3_to_target_bit(input_path, output_path, sample_format):
    # sample_format可选:'PCM_S8'(8位)、'PCM_16'(16位)、'PCM_24'(24位)、'PCM_32'(32位)
    data, samplerate = sf.read(input_path)
    sf.write(output_path, data, samplerate, format='MP3', sample_format=sample_format)

# 转换为24位示例
convert_mp3_to_target_bit('audio.mp3', 'audio_24bit.mp3', 'PCM_24')

注意:需要确保安装了支持MP3的libsndfile版本(例如在Windows上安装libsndfile-full,Linux用包管理器安装libsndfile1)。

总结

  • 8位/16位/32位转换:用pydub的set_sample_width()即可快速实现;
  • 24位转换:优先选择ffmpeg方案,无需中转且兼容性最好;
  • 避免WAV中转的核心是直接利用ffmpeg的原生MP3处理能力,跳过冗余格式转换步骤。

内容的提问来源于stack exchange,提问作者Zack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:45:35