iOS开发_录音后再播放声音太小问题解决

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];
    
posted @ 2018-12-04 20:55  CH520  阅读(953)  评论(0编辑  收藏  举报