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

如何使用LAME将MP3解码为PCM?求C++示例代码

使用LAME库将MP3解码为PCM的C++示例代码

以下是基于LAME库实现MP3到PCM解码的完整示例代码,和你提供的编码代码结构对应,方便对比理解:

#include <stdio.h>
#include <lame/lame.h>

int main(void)
{
    int read, write;

    // 打开MP3输入文件和PCM输出文件
    FILE *mp3 = fopen("file.mp3", "rb");
    FILE *pcm = fopen("file_decoded.pcm", "wb");

    // 缓冲区大小设置:MP3缓冲区建议稍大,避免截断帧数据
    const int MP3_SIZE = 8192;
    const int PCM_SIZE = 8192 * 2; // 预留足够空间存储解码后的PCM数据

    unsigned char mp3_buffer[MP3_SIZE];
    // 交错格式PCM缓冲区(左右声道数据交替存储)
    short int pcm_buffer[PCM_SIZE * 2];

    // 初始化LAME解码器实例
    lame_t lame = lame_init();
    // 强制设置为解码模式
    lame_set_decode_only(lame, 1);
    lame_init_params(lame);

    do {
        // 读取MP3文件数据
        read = fread(mp3_buffer, sizeof(unsigned char), MP3_SIZE, mp3);
        if (read == 0) {
            // 处理解码器中剩余的PCM数据
            write = lame_decode_flush(lame, pcm_buffer, PCM_SIZE);
        } else {
            // 将MP3数据解码为交错格式PCM
            // 返回值为实际输出的PCM样本数(立体声为每个声道的样本数)
            write = lame_decode_buffer_interleaved(lame, mp3_buffer, read, pcm_buffer, PCM_SIZE);
        }
        // 写入PCM数据到文件(每个立体声样本对占4字节)
        fwrite(pcm_buffer, sizeof(short int) * 2, write, pcm);
    } while (read != 0 || write > 0);

    // 清理资源
    lame_close(lame);
    fclose(mp3);
    fclose(pcm);

    return 0;
}

关键注意事项:

  • 必须通过lame_set_decode_only(lame, 1)将LAME切换为解码模式,否则无法正常执行解码逻辑。
  • 解码时LAME会自动从MP3文件头读取采样率、声道数等参数,无需手动设置;若需要确认参数,可使用lame_get_samplerate、lame_get_num_channels等函数获取。
  • 循环结束前必须调用lame_decode_flush,确保解码器中剩余的PCM数据全部输出,避免音频尾部丢失。

编译时需链接LAME库,以GCC为例:

g++ decode_mp3_to_pcm.cpp -o decode_mp3_to_pcm -lmp3lame

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:16:09