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

来源:互联网 发布:java interface 程序 编辑:程序博客网 时间:2024/06/06 16:41

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. }  


0 0
原创粉丝点击