解决libmp3lame转换wav单声道变快

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开头会有杂音

猜你喜欢

转载自blog.csdn.net/qq634416025/article/details/51424556
今日推荐