PCM转MP3音频文件(借助lame库)
来源:互联网 发布:java interface 程序 编辑:程序博客网 时间:2024/06/06 16:41
pcm2mp3.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <lame.h>
-
- #define INBUFSIZE 4096
- #define MP3BUFSIZE (int) (1.25 * INBUFSIZE) + 7200
-
- int encode(char* inPath, char* outPath)
- {
- int status = 0;
- lame_global_flags* gfp;
- int ret_code;
- FILE* infp;
- FILE* outfp;
- short* input_buffer;
- int input_samples;
- char* mp3_buffer;
- int mp3_bytes;
-
- gfp = lame_init();
- if (gfp == NULL)
- {
- printf("lame_init failed/n");
- status = -1;
- goto exit;
- }
-
- ret_code = lame_init_params(gfp);
- if (ret_code < 0)
- {
- printf("lame_init_params returned %d/n",ret_code);
- status = -1;
- goto close_lame;
- }
-
- infp = fopen(inPath, "rb");
- outfp = fopen(outPath, "wb");
-
- input_buffer = (short*)malloc(INBUFSIZE*2);
- mp3_buffer = (char*)malloc(MP3BUFSIZE);
-
- do
- {
- input_samples = fread(input_buffer, 2, INBUFSIZE, infp);
- printf("input_samples is %d./n",input_samples);
-
- mp3_bytes = lame_encode_buffer_interleaved(gfp, input_buffer,input_samples/2, mp3_buffer, MP3BUFSIZE);
-
- if (mp3_bytes < 0)
- {
- printf("lame_encode_buffer_interleaved returned %d/n", mp3_bytes);
- status = -1;
- goto free_buffers;
- }
- else if(mp3_bytes > 0)
- {
- fwrite(mp3_buffer, 1, mp3_bytes, outfp);
- }
- }while (input_samples == INBUFSIZE);
-
- mp3_bytes = lame_encode_flush(gfp, mp3_buffer, sizeof(mp3_buffer));
- if (mp3_bytes > 0)
- {
- printf("writing %d mp3 bytes/n", mp3_bytes);
- fwrite(mp3_buffer, 1, mp3_bytes, outfp);
- }
- free_buffers:
- free(mp3_buffer);
- free(input_buffer);
-
- fclose(outfp);
- fclose(infp);
- close_lame:
- lame_close(gfp);
- exit:
- return status;
- }
-
- int main(int argc, char** argv)
- {
- if (argc < 3)
- {
- printf("usage: lame_test rawinfile mp3outfile/n");
- }
- encode(argv[1], argv[2]);
- return 0;
- }
0 0