Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios AVAudioRecorder averagePowerForChannel始终返回-120.0_Ios_Avfoundation_Avaudiorecorder_Avaudiosession - Fatal编程技术网

Ios AVAudioRecorder averagePowerForChannel始终返回-120.0

Ios AVAudioRecorder averagePowerForChannel始终返回-120.0,ios,avfoundation,avaudiorecorder,avaudiosession,Ios,Avfoundation,Avaudiorecorder,Avaudiosession,我正在尝试使用AVAudioRecorder的averagePowerForChannel方法来监控iPad/iPhone应用程序麦克风上的输入电平。我有一个回调,它在一个循环中轮询平均水平——在iPhone上,它运行良好,返回合理水平,但由于某种原因,在iPad上,它总是返回-120.0 以下是我的一些设置代码: - (void) setupMic { if (micInput) { [micInput release]; micInput = nil; } NSURL *ne

我正在尝试使用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上重新启动当前场景,麦克风音量将返回正确的值

有人有什么建议吗?我在这里真是不知所措。
谢谢

我也有同样的问题。我发现将类别设置为AvaudioSessionCategoryPlay和Record可以修复此问题:

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

if (error) {
    NSLog(@"Error setting category: %@", [error description]);
}

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

另一个可能的原因非常简单,请确保您正在调用[recorder record]

该行被意外删除,我们花了一段时间才意识到这是仪表返回-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确定??):

3) 激活音频会话

 [audioSession setActive:YES error:&error];
4) 检查所有错误和返回值,包括

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

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

并启动记录器

func start() {
    recorder?.record()
    recorder?.updateMeters()
}
通过打电话来获取分贝

let decibels = recorder.averagePower(forChannel: 0)
从-120(最小值)到0。例如,一些咖啡馆的噪音水平是-20


下面是一个更详细的示例说明:同时使用更新方法。

也许它会帮助您我刚刚在模拟器(iOS 10、11、12)上遇到了这个问题。。。改用Xcode 11和iOS 13解决了这个问题。你真是个传奇,伙计
func start() {
    recorder?.record()
    recorder?.updateMeters()
}
let decibels = recorder.averagePower(forChannel: 0)