IOS中AVAudioRecorder录音问题

来源:互联网 发布:vue.js pc端ui框架 编辑:程序博客网 时间:2024/06/01 16:09

新QQ交流群:418536818,之前的群已满


-(void)doStartRecordName:(NSString *)name{

    _cafName = name;

    name = [NSString stringWithFormat:@"%@.caf",name];

    NSString *cafFilePath = [self.tmpCAFPathstringByAppendingPathComponent:name];//创建录音存储路径

    

    NSURL *cafURL = [NSURLfileURLWithPath:cafFilePath];

    

    NSError *error;

    NSLog(@"cafURL:%@" ,cafURL);

    

    NSDictionary *recordFileSettings =

 [[NSDictionary allocinitWithObjectsAndKeys:

                                  [NSNumber numberWithFloat44100.0],AVSampleRateKey//采样率

                                  [NSNumber numberWithIntkAudioFormatLinearPCM],AVFormatIDKey,

                                  [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,//采样位数 默认 16

                                  [NSNumber numberWithInt2], AVNumberOfChannelsKey,//通道的数目

                                  [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,//大端还是小端 是内存的组织方式

                                  [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,nil];//采样信号是整数还是浮点数

    NSLog(@"cafURL=%@",cafURL);

    self.avRecorder = [[AVAudioRecorderalloc]initWithURL:cafURLsettings:recordFileSettingserror:&error];

    self.avRecorder.delegate =self;

    //开启音量检测

    self.avRecorder.meteringEnabled =YES;

  [self.avRecorderprepareToRecord];

       [self.avRecorderrecord];

    

}

如题这个时候理论上是可以正常录音和测量音量的,实际情况却是真机的时候有问题,基本的就是声音没有变化,然后无法正常录音,当然在模拟器上是可以正常工作的。

这个时候需要加上下面一段代码,最好是有录音按钮页面启动的时候就添加

AVAudioSession * audioSession = [AVAudioSession sharedInstance];

[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: &error]; //设置音频类别,这里表示当应用启动,停掉后台其他音频

[audioSession setActive:YES error: &error];//设置当前应用音频活跃性

下面是定时显示音量动画

        timer = [NSTimerscheduledTimerWithTimeInterval:0.1ftarget:selfselector:@selector(detectionVoice)userInfo:nilrepeats:YES];


/**

 *  定时音量检测动画

 */

- (void)detectionVoice

{

    [self.qn.avRecorderupdateMeters];//刷新音量数据

    //获取音量的平均值  [recorder averagePowerForChannel:0];

    //音量的最大值  [recorder peakPowerForChannel:0];

    

    double lowPassResults = pow(10, (0.05 * [self.qn.avRecorderpeakPowerForChannel:0]));

    NSLog(@"%lf",lowPassResults);

    //最大50  0

    //图片 -》大

    if (0<lowPassResults<=0.06) {

        [self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_01.png"]];

    }else if (0.06<lowPassResults<=0.13) {

        [self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_02.png"]];

    }else if (0.13<lowPassResults<=0.20) {

        [self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_03.png"]];

    }else if (0.20<lowPassResults<=0.27) {

        [self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_04.png"]];

    }else if (0.27<lowPassResults<=0.34) {

        [self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_05.png"]];

    }else if (0.34<lowPassResults<=0.41) {

        [self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_06.png"]];

    }else if (0.41<lowPassResults<=0.48) {

        [self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_07.png"]];

    }else if (0.48<lowPassResults<=0.55) {

        [self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_08.png"]];

    }else if (0.55<lowPassResults<=0.62) {

        [self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_09.png"]];

    }else if (0.62<lowPassResults<=0.69) {

        [self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_10.png"]];

    }else if (0.69<lowPassResults<=0.76) {

        [self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_11.png"]];

    }else if (0.76<lowPassResults<=0.83) {

        [self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_12.png"]];

    }else if (0.83<lowPassResults<=0.9) {

        [self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_13.png"]];

    }else {

        [self.voiceHighImageViewsetImage:[UIImageimageNamed:@"record_animate_14.png"]];

    }

}

      //取消音量动画

            [self.voiceHighImageViewremoveFromSuperview];

            [timer invalidate];

            timer = nil;

最后再扯一点,IOS和安卓录音格式不同便与通用应该转为MP3格式,lame是安卓和IOS通用的转换第三方文件
导入.a和.h文件后需要转换


- (void)doChangeMP3{

    

    NSString *fileName = _cafName;

    

    fileName = [fileName stringByAppendingString:@".caf"];

    NSString *cafFilePath = [self.tmpCAFPathstringByAppendingPathComponent:fileName];//caf文件地址

    //    NSString *cafFilePath =[_strCAFPath stringByAppendingPathComponent:cafFileName];

    

    //    NSDateFormatter *fileNameFormat=[[NSDateFormatter alloc] init];

    //    [fileNameFormat setDateFormat:@"yyyyMMddhhmmss"];

    //    NSString *mp3FileName = [fileNameFormat stringFromDate:[NSDate date]];

    NSString * mp3FileName = _cafName;

    mp3FileName = [mp3FileName stringByAppendingString:@".mp3"];

    NSString *mp3FilePath = [self.tmpMp3PathstringByAppendingPathComponent:mp3FileName];

    

    @try {

        int read, write;

        

        FILE *pcm = fopen([cafFilePathcStringUsingEncoding:1],"rb");//被转换的文件

        FILE *mp3 = fopen([mp3FilePathcStringUsingEncoding:1],"wb");//转换后文件的存放位置

        

        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_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(@"%@",[exceptiondescription]);

    }

    @finally {

        

        

    }

    if (self.mp3Path) {

        self.mp3Path(mp3FilePath);//MP3地址

    }

}



0 0
原创粉丝点击