PCM转MP3音频文件(借助lame库)

本文介绍了一个简单的PCM到MP3编码程序实现过程。通过使用lame库进行音频压缩,该程序可以读取PCM文件并将其转换为MP3格式。文章详细展示了编码流程,包括初始化lame参数、读取PCM数据、压缩编码以及写入MP3文件。

pcm2mp3.c

[cpp]  view plain  copy
 print ?
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <lame.h>  
  4.   
  5. #define INBUFSIZE 4096  
  6. #define MP3BUFSIZE (int) (1.25 * INBUFSIZE) + 7200  
  7.   
  8. int encode(char* inPath, char* outPath)   
  9. {  
  10.     int status = 0;  
  11.     lame_global_flags* gfp;  
  12.     int ret_code;  
  13.     FILE* infp;  
  14.     FILE* outfp;  
  15.     short* input_buffer;  
  16.     int input_samples;  
  17.     char* mp3_buffer;  
  18.     int mp3_bytes;  
  19.   
  20.     gfp = lame_init();  
  21.     if (gfp == NULL)   
  22.     {  
  23.         printf("lame_init failed/n");  
  24.         status = -1;  
  25.         goto exit;  
  26.     }  
  27.   
  28.     ret_code = lame_init_params(gfp);  
  29.     if (ret_code < 0)   
  30.     {  
  31.         printf("lame_init_params returned %d/n",ret_code);  
  32.         status = -1;  
  33.         goto close_lame;  
  34.     }  
  35.   
  36.     infp = fopen(inPath, "rb");  
  37.     outfp = fopen(outPath, "wb");  
  38.   
  39.     input_buffer = (short*)malloc(INBUFSIZE*2);  
  40.     mp3_buffer = (char*)malloc(MP3BUFSIZE);  
  41.   
  42.     do  
  43.     {  
  44.         input_samples = fread(input_buffer, 2, INBUFSIZE, infp);  
  45.         printf("input_samples is %d./n",input_samples);  
  46.         //fprintf(stderr, "input_samples is %d./n", input_samples);  
  47.         mp3_bytes = lame_encode_buffer_interleaved(gfp, input_buffer,input_samples/2, mp3_buffer, MP3BUFSIZE);  
  48.         //fprintf(stderr, "mp3_bytes is %d./n", mp3_bytes);  
  49.         if (mp3_bytes < 0)   
  50.         {  
  51.             printf("lame_encode_buffer_interleaved returned %d/n", mp3_bytes);  
  52.             status = -1;  
  53.             goto free_buffers;  
  54.         }   
  55.         else if(mp3_bytes > 0)   
  56.         {  
  57.             fwrite(mp3_buffer, 1, mp3_bytes, outfp);  
  58.         }  
  59.     }while (input_samples == INBUFSIZE);  
  60.   
  61.     mp3_bytes = lame_encode_flush(gfp, mp3_buffer, sizeof(mp3_buffer));  
  62.     if (mp3_bytes > 0)   
  63.     {  
  64.         printf("writing %d mp3 bytes/n", mp3_bytes);  
  65.         fwrite(mp3_buffer, 1, mp3_bytes, outfp);  
  66.     }  
  67. free_buffers:  
  68.     free(mp3_buffer);  
  69.     free(input_buffer);  
  70.   
  71.     fclose(outfp);  
  72.     fclose(infp);  
  73. close_lame:  
  74.     lame_close(gfp);  
  75. exit:  
  76.     return status;  
  77. }  
  78.   
  79. int main(int argc, char** argv)   
  80. {  
  81.     if (argc < 3)   
  82.     {  
  83.         printf("usage: lame_test rawinfile mp3outfile/n");  
  84.     }  
  85.     encode(argv[1], argv[2]);  
  86.     return 0;  
  87. }  


资源下载链接为: https://pan.quark.cn/s/67c535f75d4c 在 IT 领域,音频编码技术极为关键,尤其是对于高品质音频处理。而“纯 PCM 音频 + PCM 播放器”这一主题,主要围绕无损音频编码格式——脉冲编码调制(Pulse Code Modulation,简称 PCM)以及能够播放该格式音频的播放器展开。PCM 是一种将模拟音频信号直接数字化的技术,在数字音频领域应用广泛。 PCM 是最基础的数字音频编码方式之一。它依据采样定理,把连续的模拟音频信号化为离散的数字信号。具体过程是:先以一定采样率(比如 44100Hz)对音频信号采样,该采样率是人耳可感知最高频率(约 20kHz)的两倍,符合奈奎斯特定理。然后,将每个采样点的幅度用二进制表示,通常采用 16 位量化,可表示 65536 个不同电平,从而提供良好动态范围与精度。“44100Hz,16bit”就表示音频采样率和量化位数,说明是高质量音频文件。 提到的“audacity - win - unicode - 1.3.12.exe”是音频播放器 Audacity 的安装文件。Audacity 是一款开源、跨平台的音频编辑与录音软件,支持多种音频格式,包括 PCMPCM 播放器要能处理未压缩或仅无损压缩的音频数据流,Audacity 正是这样的工具。它可让用户播放、编辑、导出 PCM 音频文件,能进行剪切、复制、粘贴、调整音量、添加特效等操作,适合音频制作与后期处理。 PCM 音频的最大优势是无损性,数字信号能完全忠实还原原始模拟信号,保持音频质量完整。它被广泛应用于 CD 音频、专业音频录制、数字音频工作站(DAW)以及高保真音乐系统等领域。不过,由于未压缩,PCM 文件体积较大,占用较多存储空间。“纯 PCM 音频 + PCM 播放器”涉及从模拟信号到数字信号换、PCM 编码
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值