10

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 で現在のシーンを再起動すると、マイク レベルが正しい値を返します。

誰にも提案はありますか?私はここで真剣に途方に暮れています。ありがとう!

4

5 に答える 5

22

同じ問題がありました。カテゴリを AVAudioSessionCategoryPlayAndRecord に設定すると修正されることがわかりました。

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

if (error) {
    NSLog(@"Error setting category: %@", [error description]);
}
于 2011-04-04T11:54:47.730 に答える
1

はい、私もそうでした。共有 AVAudioSession は 1 つだけです。そのカテゴリを設定すると、すべてのレコーダーとプレーヤーに影響するため、たとえばアプリのある領域でカテゴリを AVAudioSessionCategoryPlay に設定すると、他の領域のレコーダーが無効になります。

于 2012-02-11T14:23:29.693 に答える
0

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];
于 2015-12-10T20:51:49.343 に答える
0

これの別の考えられる原因は非常に単純です。[recorder record] を呼び出していることを確認してください。

その行は誤って削除されており、それがメーターに -120 の値が返された原因であると認識するのにしばらく時間がかかりました。

HTH

于 2012-07-07T07:05:39.130 に答える