來源 :http://m.itdecent.cn/p/06eaefee3314
/**
?wav文件轉(zhuǎn)mp3文件
?@param wavPath wav文件路徑(輸入)
?@param mp3Path mp3文件路徑(輸出)
?*/
- (void)converWav:(NSString*)wavPathtoMp3:(NSString*)mp3PathsuccessBlock:(successBlock)block{
? ? @try{
? ? ? ? FILE *fwav = fopen([wavPath cStringUsingEncoding:NSASCIIStringEncoding], "rb");
? ? ? ? fseek(fwav, 1024*4, SEEK_CUR); //跳過源文件的信息頭,不然在開頭會有爆破音
? ? ? ? FILE *fmp3 = fopen([mp3Path cStringUsingEncoding:NSASCIIStringEncoding], "wb");
? ? ? ? lame=lame_init();//初始化
? ? ? ? lame_set_in_samplerate(lame, 44100.0); //設(shè)置wav的采樣率
? ? ? ? lame_set_num_channels(lame, 2); //聲道,不設(shè)置默認(rèn)為雙聲道
? ? ? ? lame_init_params(lame);
? ? ? ? constintPCM_SIZE =640*2;//雙聲道*2 單聲道640即可
? ? ? ? const int MP3_SIZE = 8800; //計算公式pcm_size * 1.25 + 7200
? ? ? ? shortintpcm_buffer[PCM_SIZE];
? ? ? ? unsignedcharmp3_buffer[MP3_SIZE];
? ? ? ? intread, write;
? ? ? ? do{
? ? ? ? ? ? //將文件讀進(jìn)內(nèi)存
? ? ? ? ? ? read =fread(pcm_buffer,sizeof(shortint), PCM_SIZE, fwav);
? ? ? ? ? ? if(read ==0) {
? ? ? ? ? ? ? ? //當(dāng)read為0,說明pcm文件已經(jīng)全部讀取完畢,調(diào)用lame_encode_flush即可。
? ? ? ? ? ? ? ? write =lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
? ? ? ? ? ? }else { //當(dāng)read不為0,調(diào)用lame_encode_buffer_xxx進(jìn)行轉(zhuǎn)碼
? ? ? ? ? ? ? ? //雙聲道千萬要使用lame_encode_buffer_interleaved這個函數(shù)
? ? ? ? ? ? ? ? //32位、單聲道需要調(diào)用其他函數(shù),具體看代碼后面的說明
? ? ? ? ? ? ? ? write =lame_encode_buffer_interleaved(lame, pcm_buffer, read/2, mp3_buffer, MP3_SIZE);
? ? ? ? ? ? }
? ? ? ? ? ? //保存mp3文件
? ? ? ? ? ? fwrite(mp3_buffer, write,1, fmp3);
? ? ? ? }while(read !=0);
? ? ? ? //記得各種關(guān)閉
? ? ? ? lame_close(lame);
? ? ? ? fclose(fmp3);
? ? ? ? fclose(fwav);
? ? }@catch(NSException *exception) {
? ? ? ? NSLog(@"catch exception");
? ? }@finally{
? ? ? ? block();//成功轉(zhuǎn)碼后調(diào)用
? ? }
}