lame框架將PCM錄音轉成MP3格式
1、lame下載地址:https://github.com/rbrito/lame,它是一個不可執行的文件,需要借助build-lame.sh腳本將其編譯成.a靜態包。
2、build-lame.sh下載地址:https://github.com/kewlbear/lame-ios-build
3、解壓下載的lame-ios-build-master框架, 將build-lame.sh 拷貝到 /Users/xxx/xxx/lame/lame-origin目錄下。
4、修改build-lame.sh腳本,將SOURCE="lame" 修改為 SOURCE=“”。
5、sudo ./build-lame.sh, 編譯所有.a文件,大概需要一分鍾左右,編譯完成后lame-origin目錄下會生成fat-lame、thin-lame、scratch-lame三個文件夾。
6、fat-lame下的libmp3lame.a靜態包適用於所有的處理器,而thin-lame下的libmp3lame.a靜態包分別對應各個類型處理器,其實可以自己使用lipo -create -output進行合成,可以自己看看。
7、這里我們使用fat-lame下的靜態包,將fat-lame中的lame.h 和 libmp3lame.a導入工程即可。
8、截圖
9、注意,特別說明:
(1)合適libmp3lame 轉換成mp3,pcm數據必須是雙聲道。否則轉換會失敗。
(2)使用 lame_set_in_samplerate 設置參數必須與pcm數據采樣率一致。
(3)轉換源碼如下。
- (void)Wav2Mp3 { NSString *srcFile = self.srcFilePath; NSString *dstFile = self.dstFilePath; long readLen, writeLen; FILEFILE *srcWav = fopen([srcFile UTF8String], "rb"); //跳過文件頭 fseek(srcWav, sizeof(WavFileHeader), SEEK_CUR); FILEFILE *destMp3 = fopen([dstFile UTF8String], "wb"); const int PCM_SIZE = 16384; const int MP3_SIZE = 16384; short pcm_buffer[PCM_SIZE*2]; unsigned char mp3_buffer[MP3_SIZE];
//這里要注意,lame的配置要跟AVAudioRecorder的配置一樣,否則會造成轉換失敗 lame_t lame = lame_init(); lame_set_in_samplerate(lame, kSampleRate); lame_set_VBR(lame, vbr_default); lame_init_params(lame); do { readLen = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, srcWav); if (readLen == 0) { writeLen = lame_encode_flush(lame, mp3_buffer, MP3_SIZE); } else { writeLen = lame_encode_buffer_interleaved(lame, pcm_buffer, (int)readLen, mp3_buffer, MP3_SIZE); } fwrite(mp3_buffer, writeLen, 1, destMp3); } while (readLen != 0); lame_close(lame); fclose(destMp3); fclose(srcWav); }
10、參考
lame(直接使用,已經編譯成功過了):lame.zip