AVAudioRecorder averagePowerForChannel总是返回-120.0

我正在尝试使用AVAudioRecorder的averagePowerForChannel方法来监视iPad / iPhone应用程序的麦克风input级别。 我有一个callback轮询平均水平 – 在iPhone上工作正常,并返回合理的水平,但由于某种原因在iPad上,它总是返回-120.0。

这里是我的一些设置代码:

- (void) setupMic { if (micInput) { [micInput release]; micInput = nil; } NSURL *newURL = [[NSURL alloc] initFileURLWithPath:@"/dev/null"]; NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] init]; [recordSettings setObject:[NSNumber numberWithInt:kAudioFormatAppleLossless] forKey: AVFormatIDKey]; [recordSettings setObject:[NSNumber numberWithFloat:22050.0] forKey: AVSampleRateKey]; // [recordSettings setObject:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey]; [recordSettings setObject:[NSNumber numberWithInt:12800] forKey:AVEncoderBitRateKey]; [recordSettings setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; [recordSettings setObject:[NSNumber numberWithInt: AVAudioQualityLow] forKey: AVEncoderAudioQualityKey]; micInput = [[AVAudioRecorder alloc] initWithURL:newURL settings:recordSettings error:nil]; // [micInput setMeteringEnabled:YES]; [newURL release]; [recordSettings removeAllObjects]; [recordSettings release]; } 

以及我的开始录制方法:

 - (void) startRecording { NSLog(@"startRecording!"); [micInput pause]; [micInput prepareToRecord]; micInput.meteringEnabled = YES; [micInput record]; [micInput updateMeters]; levelTimer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:0.0] interval:0.03 target:self selector:@selector(levelTimerCallback:) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:levelTimer forMode:NSDefaultRunLoopMode]; } 

和一些levelTimercallback:

 - (void)levelTimerCallback:(NSTimer *)timer { [micInput updateMeters]; double avgPowerForChannel = pow(10, (0.05 * [micInput averagePowerForChannel:0])); [micSprite receiveInput:avgPowerForChannel]; NSLog(@"Avg. Power: %f", [micInput averagePowerForChannel:0]); ... } 

在iPhone上,NSLog语句将返回合理的值,iPad将始终返回-120.0。

注意:我正在使用这个在一个cocos2d应用程序里面。 出于某种原因,如果我重新启动iPad上的当前场景,话筒电平将返回正确的值。

任何人有任何build议? 我在这里很严重。 谢谢!

我遇到过同样的问题。 我发现将类别设置为AVAudioSessionCategoryPlayAndRecord修复它:

 NSError *error; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&error]; if (error) { NSLog(@"Error setting category: %@", [error description]); } 

是的,我也是。 只有一个共享的AVAudioSession。 设置其类别会影响所有的录音机和播放器,因此在应用程序的一个区域中将类别设置为AVAudioSessionCategoryPlay可以禁用其他区域的录音机。

另一个可能的原因很简单,确保你打电话给[logging器logging];

这条线被意外地删除了,我们花了一段时间才认识到这是因为仪表返回-120的原因。

HTH

1)确保您有权限:

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission:)]) { [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) { NSLog(@"permission : %d", granted); if(granted)[self setupMic];// record ... }]; } } 

2)确保你的path是合法的(/ dev / null好吗??):

 NSString* dir=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSArray *pathComponents = [NSArray arrayWithObjects:dir,fileName,nil]; recordedAudioURL = [NSURL fileURLWithPathComponents:pathComponents]; 

3)激活audioSession

  [audioSession setActive:YES error:&error]; 

4)检查所有的错误和返回值,包括

 BOOL ok=[micInput prepareToRecord]; ok=ok &&[micInput record]; 

您需要初始化AVAudioSession(它应该从didMoveToview方法完成,这可能是问题的原因)

 let session = AVAudioSession.sharedInstance() try session.setCategory(AVAudioSessionCategoryPlayAndRecord) try session.overrideOutputAudioPort(AVAudioSessionPortOverride.speaker) try session.setActive(true) try recorder = AVAudioRecorder(url: getDocumentsDirectory(), settings: settings) 

并开始logging

 func start() { recorder?.record() recorder?.updateMeters() } 

通过调用来获得分贝

 let decibels = recorder.averagePower(forChannel: 0) 

从-120(最小值)到0。一些咖啡馆的噪音水平例如是-20

这里是更详细的例子http://www.mikitamanko.com/blog/2017/04/15/swift-how-to-get-decibels/注意:也使用更新方法。