最近使用lame工具在安卓上转换pcm为mp3,遇到了许多问题,特意将解决方案记录下来供大家参考。
一、全是噪音
原因在于安卓上字节排序是小端,而lame的处理的是大端字节序,所以不转换大小端处理出来得文件就全部是噪音。
二、单声道和立体声问题
立体声能转换,而单声道声音诡异
#define INBUFSIZE 4096 #define MP3BUFSIZE (int) (1.25 * INBUFSIZE) + 7200//官方推荐大小,类型为int FILE *infp;//输入文件pcm FILE *outfp;//输出文件mp3 short int *input_buffer; unsigned char *mp3_buffer; mp3_buffer = (unsigned char *) malloc((size_t)MP3BUFSIZE); input_buffer = (short int *) malloc((size_t)INBUFSIZE*channels );//喂数据的buffer的大小要乘以声道数,单声channels为1,立体声为2 read = fread(input_buffer, sizeof(short int)*channels,(size_t)INBUFSIZE, infp);//从pcm文件中读数据 if (channels == 2) { write = lame_encode_buffer_interleaved(gfp, input_buffer, read, mp3_buffer,MP3BUFSIZE);//立体声用此方法编码 } else if (channels == 1) { write= lame_encode_buffer(gfp, input_buffer, input_buffer, read,mp3_buffer, MP3BUFSIZE);//单声道 }
三、转换出的MP3时间缩短
1.需要在lame_encode_flush(gfp,mp3_buffer, sizeof(mp3_buffer))方法之后,lame_close(gfp)之前调用lame_mp3_tags_fid(gfp,outfp)方法为MP3文件添加vbr头,播放器才能正读取时间
2.在配置lame的参数时,一定要和录音时的设置一致。而且如果在初始化解码器时使用lame_set_VBR(gfp, vbr_default)这个方法也可能导致时间缩短。