zoukankan      html  css  js  c++  java
  • 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:@"应用需要访问您的麦克风。
      请启用麦克风-设置/隐私/麦克风"]
                                         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];
      
  • 相关阅读:
    POJ 3140 Contestants Division (树dp)
    POJ 3107 Godfather (树重心)
    POJ 1655 Balancing Act (树的重心)
    HDU 3534 Tree (经典树形dp)
    HDU 1561 The more, The Better (树形dp)
    HDU 1011 Starship Troopers (树dp)
    Light oj 1085
    Light oj 1013
    Light oj 1134
    FZU 2224 An exciting GCD problem(GCD种类预处理+树状数组维护)同hdu5869
  • 原文地址:https://www.cnblogs.com/CH520/p/9440391.html
Copyright © 2011-2022 走看看