1、AVAudioSessionCategory说明

  • 1.1 AVAudioSessionCategoryAmbient 或 kAudioSessionCategory_AmbientSound
  • 用于非以语音为主的应用,使用这个category的应用会随着静音键和屏幕关闭而静音。
  • 并且不会中止其它应用播放声音,可以和其它自带应用如iPod,safari等同时播放声音。
  • 注意:该Category无法在后台播放声音
  • 1.2 AVAudioSessionCategorySoloAmbient 或 kAudioSessionCategory_SoloAmbientSound
  • 类似于AVAudioSessionCategoryAmbient 不同之处在于它会中止其它应用播放声音。
  • 这个category为默认category。该Category无法在后台播放声音
  • 1.3 AVAudioSessionCategoryPlayback 或 kAudioSessionCategory_MediaPlayback
  • 用于以语音为主的应用,使用这个category的应用不会随着静音键和屏幕关闭而静音。
  • 可在后台播放声音
  • 1.4 AVAudioSessionCategoryRecord 或 kAudioSessionCategory_RecordAudio
  • 用于需要录音的应用,设置该category后,除了来电铃声,闹钟或日历提醒之外的其它系统声音都不会被播放。
  • 该Category只提供单纯录音功能。
  • 1.5 AVAudioSessionCategoryPlayAndRecord 或 kAudioSessionCategory_PlayAndRecord
  • 用于既需要播放声音又需要录音的应用,语音聊天应用(如微信)应该使用这个category。
  • 该Category提供录音和播放功能。如果你的应用需要用到iPhone上的听筒,该category是你唯一的选择,
  • 在该Category下声音的默认出口为听筒(在没有外接设备的情况下)。

1.6 注意

  • 并不是一个应用只能使用一个category,程序应该根据实际需要来切换设置不同的category,
  • 举个例子,录音的时候,需要设置为AVAudioSessionCategoryRecord,
  • 当录音结束时,应根据程序需要更改category为AVAudioSessionCategoryAmbient,
  • AVAudioSessionCategorySoloAmbient或AVAudioSessionCategoryPlayback中的一种。

2、录音后再播放声音太小问题解决

2.1 方法一:录音结束恢复播放模式

/********************** 开始录音 **********************************/
- (void)onRecordSoundStart:(UIButton *)sender {
    if (![self canRecord]) {
        [[[UIAlertView alloc] initWithTitle:nil message:[NSString stringWithFormat:@"应用需要访问您的麦克风。\n请启用麦克风-设置/隐私/麦克风"]
                                   delegate:nil
                          cancelButtonTitle:@"好"
                          otherButtonTitles:nil] show];
        return;
    }
    [self initRecordSession];
    NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
                                                    [NSNumber numberWithFloat:44100.0], AVSampleRateKey ,    //采样率 8000/44100/96000
                                                    [NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVFormatIDKey,  //录音格式
                                                    [NSNumber numberWithInt:16], AVLinearPCMBitDepthKey,   //线性采样位数  8、16、24、32
                                                    [NSNumber numberWithInt:2], AVNumberOfChannelsKey,      //声道 1,2
                                                    [NSNumber numberWithInt:AVAudioQualityHigh], AVEncoderAudioQualityKey, //录音质量
                                                    nil];


    NSURL *strURL = [NSURL fileURLWithPath:[self GetRecordSoundFileName:sender.tag]];
    _recorder = [[AVAudioRecorder alloc] initWithURL:strURL settings:settings error:nil];
    _recorder.meteringEnabled = YES;
    _recorder.delegate = self;
    [_recorder prepareToRecord];
    [_recorder record];
    _timerRec = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(detectionVoice) userInfo:nil repeats:YES];
}

/********************** 结束录音 **********************************/
- (void)onRecordSoundStop:(UIButton *)sender {

    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryPlayback error:nil];  //此处需要恢复设置回放标志,否则会导致其它播放声音也会变小
    [session setActive:YES error:nil];
    [_timerRec invalidate];
    if (_recorder.currentTime > 1) {
        [_recorder stop];
        PlayNodeData *model = _dataOfVideoArrary[sender.tag];
        model.hasSound  = YES;
        [_btnPlay setImage:[UIImage imageNamed:@"simulate_image_play1"] forState:UIControlStateNormal];
    }
}

/********************** 录音器是否可用检查 **********************************/
- (BOOL)canRecord {
    __block BOOL bCanRecord = YES;
    if ([[[UIDevice currentDevice] systemVersion] compare:@"7.0"] != NSOrderedAscending) {
        AVAudioSession *audioSession = [AVAudioSession sharedInstance];
        if ([audioSession respondsToSelector:@selector(requestRecordPermission:)]) {
            [audioSession performSelector:@selector(requestRecordPermission:) withObject:^(BOOL granted) {
                if (granted) {
                    bCanRecord = YES;
                } 
                else {
                    bCanRecord = NO;
                }
            }];
        }
    }

    return bCanRecord;
}

/********************** 初始化录音器 **********************************/
- (void)initRecordSession {
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
    [session setActive:YES error:nil];
}

/********************** 录音中音量更新 **********************************/
- (void)detectionVoice {
    return;
    [_recorder updateMeters];//刷新音量数据
    //获取音量的平均值  [recorder averagePowerForChannel:0];
    //音量的最大值  [recorder peakPowerForChannel:0];
    double lowPassResults = pow(10, (0.05 * [_recorder peakPowerForChannel:0]));
    NSLog(@"%lf",lowPassResults);
    //最大50  0
    //图片 小-》大
    if (0 < lowPassResults <= 0.06) {
        ;
    }
    else if (0.06 < lowPassResults <= 0.13) {
        ;
    }
    else if (0.13 < lowPassResults <= 0.20) {
        ;
    }
    else if (0.20 < lowPassResults <= 0.27) {
        ;
    }
}

2.2 方法二:设置听筒模式

[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];