Iphone-peakPowerForChannel function in AVAudioRecorder not working

I am trying to use an AVAudioRecorder instance to record sound, the entire recording progress is fine, except that when I call [recorder peakPowerForChannel: 0], trying to get the volume, the return value is always 0, this is rather strange ..

I checked the recorded sound file, this is completely normal. Then I use AVAudioPlayer to play it, and during the game I call [player peakPowerForChannel: 0], the return value seems correct and makes sense.

How can I get the correct value? I set this: recoder.meteringEnabled = YES and called [recorder updateMeters] every time I call [recorder peakPowerForChannel: 0]. The initial recording of the recorder is as follows:

NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];
//General Audio Format Settings 
[recordSetting setValue:[NSNumber numberWithInt: 'ima4'] forKey:AVFormatIDKey]; 
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];
//Linear PCM Format Settings 
[recordSetting setValue:[NSNumber numberWithInt: 32] forKey:AVLinearPCMBitDepthKey]; 
[recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; 
[recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];
//Encoder Settings 
[recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityMedium] forKey:AVEncoderAudioQualityKey]; 
[recordSetting setValue:[NSNumber numberWithInt:96] forKey:AVEncoderBitRateKey]; 
[recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVEncoderBitDepthHintKey];
//Sample Rate Conversion Settings 
[recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVSampleRateConverterAudioQualityKey];
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:nil];
recorder.meteringEnabled = YES;
0
4

, meteringEnabled, record prepareToRecord.

:

[recorder prepareToRecord];

recorder.meteringEnabled = YES;

.

+3

. . , , , , updateMeters

( )

[recorder prepareToRecord];
recorder.meteringEnabled = YES;
//Start the actual Recording
[recorder record];

NSTimer *TimerUpdate = [NSTimer scheduledTimerWithTimeInterval:.1 
   target:self selector:@selector(timerTask) userInfo:nil repeats:YES];

:

- (void) timerTask {
   [recorder updateMeters];
   float level = [recorder peakPowerForChannel:0];
   NSLog(@"%f", level);
}
+3

1 2, 0

0

0, 0 . Apple:

Return Value
The current peak power in decibels for the recorded sound. A return value of 0 dB means full scale or maximum power; a return value of -160 dB indicates the minimum power (i.e. near silence).

http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAudioRecorder_ClassReference/Reference/Reference.html

You want averagePowerForChannel: instead.

0
source

All Articles