您的位置:首页 > 移动开发 > IOS开发

lame,把ios录音转换为mp3格式

2014-02-27 11:39 513 查看
在ios设备中进行录音,录音文件的格式为caf。但这种格式在很多设备中没法播放。为了适应终端的播放功能,特将caf转换为mp3格式文件来使用。

在录制caf文件时,需要使用双通道,否则在转换为MP3格式时,声音不对。caf录制端的设置为:

NSMutableDictionary * recordSetting = [NSMutableDictionary
dictionary];

[recordSetting
setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM]
forKey:AVFormatIDKey];//
[recordSetting
setValue:[NSNumber numberWithFloat:8000.0]
forKey:AVSampleRateKey];//采样率
[recordSetting
setValue:[NSNumber numberWithInt:
2] forKey:AVNumberOfChannelsKey];//声音通道,这里必须为双通道
 [recordSetting
setValue:[NSNumber numberWithInt:AVAudioQualityLow]
forKey:AVEncoderAudioQualityKey];//音频质量
在转换mp3端的代码为:

NSString *cafFilePath = cafFilePathName;    //caf文件路径
NSString *mp3FilePath = mp3FilePathName;//存储mp3文件的路径
    NSFileManager* fileManager=[NSFileManager
defaultManager];
    if([fileManager
removeItemAtPath:mp3FilePath error:nil])
    {
        NSLog(@"删除");
    }
    
    @try {
        int read, write;
        FILE *pcm =
fopen([cafFilePath cStringUsingEncoding:1],
"rb");  //source 被转换的音频文件位置
        if(pcm ==
NULL)
        {
            NSLog(@"file not found");
        }
        else
        {
            fseek(pcm,
4*1024, SEEK_CUR);                                  
//skip file header
            FILE *mp3 =
fopen([mp3FilePath cStringUsingEncoding:1],
"wb");  //output 输出生成的Mp3文件位置
            
            const
int PCM_SIZE = 8192;
            const
int MP3_SIZE = 8192;
            short
int pcm_buffer[PCM_SIZE*2];
            unsigned
char mp3_buffer[MP3_SIZE];
            
            lame_t lame =
lame_init();
            lame_set_num_channels(lame,1);//设置1为单通道,默认为2双通道
            lame_set_in_samplerate(lame,
8000.0);//11025.0
            //lame_set_VBR(lame, vbr_default);
            lame_set_brate(lame,8);
            lame_set_mode(lame,3);
            lame_set_quality(lame,2);
/* 2=high 5 = medium 7=low 音质*/
            lame_init_params(lame);
            
            do {
                read =
fread(pcm_buffer, 2*sizeof(short
int), PCM_SIZE, pcm);
                if (read ==
0)
                    write =
lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
                else
                    write =
lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
                
                fwrite(mp3_buffer, write,
1, mp3);
                
            } while (read !=
0);
            
            lame_close(lame);
            fclose(mp3);
            fclose(pcm);
            return
YES;
        }
        return
NO;
    }
    @catch (NSException *exception) {
        NSLog(@"%@",[exception
description]);
        return
NO;
    }
    @finally {
        NSLog(@"执行完成");
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lame MP3 音频转换 ios caf