iOS: lame框架将PCM录音转成MP3格式
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
程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!