![](/img/trans.png)
[英]AVAudioRecorder.record() always returns “false” in iOS 8
[英]AVAudioRecorder averagePowerForChannel always returns -120.0
我正在尝试使用AVAudioRecorder的averagePowerForChannel方法来监控iPad / iPhone应用程序的麦克风输入电平。 我有一个回调轮询循环中的平均水平 - 在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];
}
以及一些levelTimer回调:
- (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上的当前场景,麦克风级别将返回正确的值。
有人有什么建议吗? 我在这里真的很茫然。 谢谢!
我遇到过同样的问题。 我发现将类别设置为AVAudioSessionCategoryPlayAndRecord修复它:
NSError *error;
[[AVAudioSession sharedInstance]
setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
if (error) {
NSLog(@"Error setting category: %@", [error description]);
}
是的,我也是。 只有一个共享的AVAudioSession。 设置其类别会影响所有录像机和播放器,因此在应用程序的一个区域中将类别设置为AVAudioSessionCategoryPlay会禁用其他区域中的录像机。
另一个可能的原因很简单,确保你正在调用[录音机记录];
那条线被意外删除了,我们花了一段时间才意识到这是因为仪表上返回-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)确保你的路径是合法的(/ dev / null ok ??):
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)
并启动录音机
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/注意:也可以使用更新方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.