如何使用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
相关产品推荐
相关产品推荐

