LameMp3开发问题解决方案锦集(安卓ndk)

最近使用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)这个方法也可能导致时间缩短。




猜你喜欢

转载自blog.csdn.net/tcsupreme/article/details/80385670