libmp3lame库的地址:http://blog.csdn.net/allen315410/article/details/42456661
为什么会变快? 是因为该博主使用的时候双声道录音, 如何是单声道录音就会使速度变快,修改的代码如下:
JNIEXPORT void JNICALL Java_com_tian_voicechangerpro_ChangerActivity_convertmp3
(JNIEnv * env, jobject obj, jstring jwav, jstring jmp3 ) {
char* cwav =Jstring2CStr(env,jwav) ;
char* cmp3=Jstring2CStr(env,jmp3);
LOGI("wav = %s", cwav);
LOGI("mp3 = %s", cmp3);
//1.打开 wav,MP3文件
FILE* fwav = fopen(cwav,"rb");
fseek(fwav, 4*1024, SEEK_CUR);
FILE* fmp3 = fopen(cmp3,"wb");
int channel = 1;//单声道
short int wav_buffer[8192*channel];
unsigned char mp3_buffer[8192];
//1.初始化lame的编码器
lame_t lame = lame_init();
//2. 设置lame mp3编码的采样率
lame_set_in_samplerate(lame , 44100);
lame_set_out_samplerate(lame, 44100);
lame_set_num_channels(lame,1);
lame_set_mode(lame, MONO);
// 3. 设置MP3的编码方式
lame_set_VBR(lame, vbr_default);
lame_set_brate(lame, 32);
lame_init_params(lame);
LOGI("lame init finish");
int read ; int write; //代表读了多少个次 和写了多少次
int total=0; // 当前读的wav文件的byte数目
do{
if(flag==404){
return;
}
read = fread(wav_buffer,sizeof(short int)*channel, 8192,fwav);
total += read* sizeof(short int)*channel;
LOGI("converting ....%d", total);
publishJavaProgress(env,obj,total);
// 调用java代码 完成进度条的更新
if(read!=0){
write = lame_encode_buffer(lame, wav_buffer, NULL, read, mp3_buffer, 8192);
//write = lame_encode_buffer_interleaved(lame,wav_buffer,read,mp3_buffer,8192);
//把转化后的mp3数据写到文件里
fwrite(mp3_buffer,sizeof(unsigned char),write,fmp3);
}
if(read==0){
lame_encode_flush(lame,mp3_buffer,8192);
}
}while(read!=0);
LOGI("convert finish");
lame_close(lame);
fclose(fwav);
fclose(fmp3);
}
注意:需要跳过wav文件头, 不然转换出来的mp3开头会有杂音
fseek(fwav, 4*1024, SEEK_CUR);//传入的是wav格式的文件,所以跳过文件头,不然转换出来的mp3开头会有杂音