首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AVAudioRecorder averagePowerForChannel始终返回-120.0

AVAudioRecorder averagePowerForChannel始终返回-120.0
EN

Stack Overflow用户
提问于 2011-02-17 05:45:53
回答 5查看 6.3K关注 0票数 10

我正在尝试使用AVAudioRecorder的averagePowerForChannel方法来监控iPad/iPhone应用程序麦克风上的输入电平。我有一个回调函数,它在一个循环中轮询平均水平-在iPhone上它工作得很好,并返回合理的水平,但由于某种原因,在iPad上它总是返回-120.0。

下面是我的一些设置代码:

代码语言:javascript
运行
复制
- (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];
}

以及我的开始录制方法:

代码语言:javascript
运行
复制
- (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回调:

代码语言:javascript
运行
复制
- (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上的当前场景,麦克风电平将返回正确的值。

有人有什么建议吗?我真的不知所措。谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-04 19:54:48

我也有同样的问题。我发现将类别设置为AVAudioSessionCategoryPlayAndRecord可以解决这个问题:

代码语言:javascript
运行
复制
NSError *error;
[[AVAudioSession sharedInstance] 
    setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];

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

Stack Overflow用户

发布于 2012-02-11 22:23:30

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

票数 1
EN

Stack Overflow用户

发布于 2012-07-07 15:05:39

另一种可能的原因很简单,请确保调用的是recorder record;

这一行被意外删除了,我们花了一段时间才意识到这是仪表上返回-120值的原因。

HTH

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5022514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档