簡體   English   中英

AVAudioRecorder averagePowerForChannel始終返回-120.0

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM