2011-07-11 7 views
3

AVAudioRecorder(iPadでのテスト)から正確なメーターを読み取ることができません。iPadのAVAudioRecorderメーター遅延

音量が上がっている間はうまくいくようですが、音量が下がると遅延が発生します。例:私はマイクに向かって話し、ゆっくりと私の声を上げます。読み取り値は-35.567から-34.678まで-10.579まで増加しますが、話しを止めると1~2秒遅れて-35.567(またはそれが起こったとき)に戻ります。 NSLogはループからの更新を続けますが、音が長い間終了していても、遅延中にメーター番号は変わりません。

以下のコードの要点を追加しました。必要に応じてフルコードを入力していただければ幸いです。

私はそうのようなレコーダーを初期化します。

AVAudioSession * audioSession = [AVAudioSession sharedInstance]; 
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: &error]; 
[audioSession setActive:YES error: &error]; 

NSMutableDictionary* recordSetting = [[NSMutableDictionary alloc] init]; 
[recordSetting setValue :[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey]; 
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey]; 

recordedTmpFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithString: @"Recording.caf"]]]; 

recorder = [[ AVAudioRecorder alloc] initWithURL:recordedTmpFile settings:recordSetting error:&error]; 
[recorder setDelegate:self]; 
[recorder prepareToRecord]; 
[recorder setMeteringEnabled:YES]; 

[recorder record]; 

とループにメーターを更新します。

編集した
-(void) loop:(ccTime)dt 
{ 
    if(isRecording == YES) 
    {   
     //get volume levels 
     [recorder updateMeters]; 
     float level = [recorder peakPowerForChannel:0]; 
     NSLog(@"Vol: %f", level); 
    } 
} 

私も、私はのためのCocos2dスケジュールを使用していますことを言及する必要がありますループ:

[self schedule:@selector(loop:)]; 

そのような長い遅延でしょうか?

編集:平均ピーク電力を試しましたが、これには遅延がありません。だから私はおそらくそれを回避策として使うことができた。しかし、私はむしろピークパワーを使用したり平均化したりしません。何が起きているのかを理解することは良いことです。

+0

ループのループ間隔は何ですか:(ccTime)dt関数? – Raptor

+0

デフォルトです。私はそれが何であるか分かりません。しかし、このループは遅延中にNSLogを何度も更新しています。突然降りるまで同じ数字が残っています。 – Kangoo

+0

これはループを開始します:[self schedule:@selector(loop :)]; – Kangoo

答えて

2

後、私は確信している 速くmutchだろうほとんどのユーザーがこれを把握していますが、計測を遅らせたい場合は、AudioQueueまたはRemoteIOを使用する必要があります。ここでは、より良い説明を参照してください。

Confusion with meters in AVAudioRecorder

1

タイマーの使用はどうですか?

NSError* error 
     if (recorder) { 
      recorder.meteringEnabled = YES; 
      [recorder record]; 
      levelTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES]; 
    } else 
      NSLog(@" error %@",[error description]); 
     } 
levelTimerはメーターを更新し、あなたは(levelTimerCallback :)何をしたいん関数を呼び出すことNStimerある

など

-(IBAction)levelTimerCallback:(NSTimer*)timer 
{ 
    [recorder updateMeters]; 
     float level = [recorder peakPowerForChannel:0]; 
     NSLog(@"Vol: %f", level); 
} 
+0

いいえ、それは私のために働かなかった。あなたはこれをあなたの側で働かせるために船に乗りましたか、それともこれは試験されていませんか?悪意のある人は意図していません - セットアップに何か問題があるかどうか疑問に思っています。問題はタイマーのようではありません。タイマーはコンソールの更新を継続しますが、番号を削除する必要があるときは同じままです。ご協力いただきありがとうございます。 – Kangoo

2

あなたはYESmeteringEnabledプロパティをリセットすることでこの問題を解決することができます。

yourRecorderName.meteringEnabled = YES 

レベルをアンビエントレベルにリセットするたびに呼び出します。これには約0.02秒かかります。その時、レベルは周囲温度にリセットする前に一時的に0または-120 dBに下がります。

はまた、あなたが使用することができます。

[yourRecorderName stop] 
[yourRecorderName record] 

をこれは、約0.05秒かかりますが、レベルが待ち時間に0にドロップダウンしません。実際には何も起こりません。この場合、実際にレコーダーオブジェクトを0.05秒間停止して再度録画を開始するためです。