IOS麦克风检测首次获取语音失败 IOS7.



干草伙计们,我正在开发一个 Ipad 应用程序,在其中我播放 3 次哔哔声,然后检测语音。但问题是,当我第一次在阅读屏幕上开始阅读时,哔哔声很好,但麦克风剂量无法检测到声音。如果移动到另一个屏幕并再次进入阅读屏幕,那么哔哔声是完美的,麦克风也可以正常工作。播放蜂鸣音的代码如下

   - (void)playAudio
    {
      [self setupAudioSession];
       NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"beep" ofType:@"mp3"];
       NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath];
      AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
    [fileURL release];
     self.click = newPlayer;
     [newPlayer release];
     [self.click setDelegate:self];
      [self.click  prepareToPlay];
     [self.click  play];
}
  - (void)setupAudioSession {
     static BOOL audioSessionSetup = NO;
      if (audioSessionSetup) {
         return;
     }
   [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
UInt32 doSetProperty = 1;
    AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
   [[AVAudioSession sharedInstance] setActive: YES error: nil];
  audioSessionSetup = YES;
 }

播放哔哔声后,我调用了这个函数来检测麦克风

-(void)startrecordingAfterCountdown{
        NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];
        [self.view setUserInteractionEnabled:true];
         NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
                          [NSNumber numberWithFloat: 44100.0],                 AVSampleRateKey,
                          [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
                          [NSNumber numberWithInt: 1],                         AVNumberOfChannelsKey,
                          [NSNumber numberWithInt: AVAudioQualityMax],         AVEncoderAudioQualityKey,
                          nil];
NSError *error;
   //    
   //    //    static BOOL audioSessionSetup2 = NO;
   //    //    if (audioSessionSetup2) {
   //    //         //return;
    //    //    }
    //       [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryRecord error: nil];
   //        UInt32 doSetProperty = 1;
   //    
   //       AudioSessionSetProperty kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
  //    
  //        [[AVAudioSession sharedInstance] setActive: YES error: nil];
  //    
  //       // audioSessionSetup2 = YES;
  //        AVAudioSession *audioSession = [AVAudioSession sharedInstance];
  //        [audioSession setActive:YES error:nil];
   //        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil];
      recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
if (recorder) {
    [recorder prepareToRecord];
    recorder.meteringEnabled = YES;
    [recorder record];
    levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
} else{
    NSLog(@"error%@",[error description]);
}

- (void)levelTimerCallback:(NSTimer *)timer {
[recorder updateMeters];
const double ALPHA = 0.05;
double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0]));
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;
if (lowPassResults > 0.20){
    NSLog(@"%2f",lowPassResults);

}

}

请告诉我如何解决这个问题..麦克风将首次检测到语音

为了捕获音频,在调用prepareToRecord之前,您需要在代码中执行此操作:

NSError *error; 
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:&error];

请确保在进行调用后检查error对象,以防设置类别时出错。

嘿伙计们,我刚刚通过更改代码解决了这个问题。-(void)setupaudioSession && -(void)startrecordingAfterCountdown methods.

- (void)setupAudioSession {
 static BOOL audioSessionSetup = NO;
  if (audioSessionSetup) {
    // return;
 }
  [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
   UInt32 doSetProperty = 1;
  AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
   [[AVAudioSession sharedInstance] setActive: YES error: nil];
    audioSessionSetup = YES;
 }

-(void)startrecordingAfterCountdown{
    NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];
    [self.view setUserInteractionEnabled:true];
     NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithFloat: 44100.0],                 AVSampleRateKey,
                      [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
                      [NSNumber numberWithInt: 1],                         AVNumberOfChannelsKey,
                      [NSNumber numberWithInt: AVAudioQualityMax],         AVEncoderAudioQualityKey,
                      nil];
     NSError *error;

        //    static BOOL audioSessionSetup2 = NO;
        //    if (audioSessionSetup2) {
       //         //return;
      //    }
     // [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryRecord error: nil];
  // UInt32 doSetProperty = 1;
 //AudioSessionSetProperty kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
   // [[AVAudioSession sharedInstance] setActive: YES error: nil];
   // audioSessionSetup2 = YES;
      AVAudioSession *audioSession = [AVAudioSession sharedInstance];
      [audioSession setActive:YES error:nil];
       [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil];
     recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
   if (recorder) {
           [recorder prepareToRecord];
            recorder.meteringEnabled = YES;
            [recorder record];
        levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
      } else{
         NSLog(@"error%@",[error description]);
     }
 }

最新更新