美文网首页
使用lame将.caf录音转.MP3格式

使用lame将.caf录音转.MP3格式

作者: 任兴金 | 来源:发表于2018-04-25 12:57 被阅读26次
    //首先在录音过程中,需要对录音参数进行设置
        NSMutableDictionary *settingDic = [[NSMutableDictionary alloc] init];
        //设置录音格式
        [settingDic setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
        //设置录音采样率(Hz) 如:AVSampleRateKey==8000/44100/96000(影响音频的质量)
        [settingDic setValue:[NSNumber numberWithFloat:44100] forKey:AVSampleRateKey];
        //录音通道数  1 或 2 
        [settingDic setValue:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];
        //线性采样位数  8、16、24、32
        [settingDic setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
        //录音的质量
        [settingDic setValue:[NSNumber numberWithInt:AVAudioQualityMax] forKey:AVEncoderAudioQualityKey];
    

    lame地址
    https://github.com/hedgehogIda/caf-mp3
    下载完成直接拖到项目中就可以,包含图文件lame.h,然后再需要转MP3的地方调用如下方法:

    //caf文件地址
    -(NSString*)toMP3{
         //caf音频地址
    NSString * cafPath = [NSHomeDirectory() stringByAppendingPathComponent:@"/Documents/CDPAudioFiles/CDPAudioRecord.caf"];
        //转MP3的地址
        NSString *mp3FileName = @"Mp3File";
        mp3FileName = [mp3FileName stringByAppendingString:@".mp3"];
        NSString *mp3FilePath = [[NSHomeDirectory() stringByAppendingFormat:@"/Documents/"] stringByAppendingPathComponent:mp3FileName];
        
        @try {
            int read, write;
            
            FILE *pcm = fopen([cafPath cStringUsingEncoding:1], "rb");  //source
            fseek(pcm, 4*1024, SEEK_CUR);                                   //skip file header
            FILE *mp3 = fopen([mp3FilePath cStringUsingEncoding:1], "wb");  //output
            
            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_in_samplerate(lame,44100);
            lame_set_VBR(lame, vbr_default);
            lame_set_num_channels(lame, 2);
            lame_set_brate(lame,16);
            lame_set_mode(lame,3);
            lame_set_quality(lame,1); /* 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);
        }
        @catch (NSException *exception) {
            NSLog(@"%@",[exception description]);
        }
        @finally {
           return mp3FilePath;
            NSLog(@"转换成功");
        }
        return @"";
    }
    

    问题分析:
    录音完转MP3声音严重失真?

    本人尝试按上面代码中的设置是没有问题的,具体每个参数对音频质量的影响我也是菜鸟
     1.caf录音的设置保持与转换的基本一致
     2.通道双通道
     3.录音质量调高
    

    录制完成后声音太小

    录制过程中,设置AudioSession会话类别
    -(void)setAudioSessionCategory:(NSString *)category{
       NSError *sessionError;
    
       [_session setCategory:category error:&sessionError];
       
       //启动音频会话管理
       if(_session==nil||sessionError){
           DLog(@"CDPAudioRecorder设置AVAudioSession会话类别Category错误:%@",sessionError);
       }else{
           [_session setActive:YES error:nil];
       }
    }
    录制结束后,再这样设置一下
    //录音结束
    -(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag{
       if (flag) {
           [_session setActive:NO error:nil];
           [_session setCategory:AVAudioSessionCategoryPlayback error:nil];
           DLog(@"CDPAudioRecorder录音完成,文件大小为%@",[CDPAudioRecorder fileSizeAtPath:_recordURL.path]);
       }
    }
    
    

    相关文章

      网友评论

          本文标题:使用lame将.caf录音转.MP3格式

          本文链接:https://www.haomeiwen.com/subject/ounelftx.html