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

简书:iOS - 录音文件lame转换MP3相关配置

demo:https://github.com/rpplusplus/iOSMp3Recorder

posted @ 2017-10-11 15:20  XYQ全哥  阅读(3681)  评论(0编辑  收藏  举报