Estoy tratando de utilizar el método AveragePowerForChannel de AVAudioRecorder para monitorear los niveles de entrada en el micrófono para una aplicación de iPad/iPhone. Tengo una devolución de llamada que sondea el nivel promedio en un bucle: en el iPhone funciona bien y devuelve niveles razonables, pero por alguna razón en el iPad siempre devuelve -120.0.AVAudioRecorder averagePowerForChannel siempre devuelve -120.0
Aquí es parte de mi código de configuración:
- (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];
}
Así como mi método de inicio de grabación:
- (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];
}
y un poco de la devolución de llamada 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]);
...
}
Cuando el el iPhone, la declaración NSLog arrojará valores razonables, y el iPad siempre devolverá -120.0.
Nota: Estoy usando esto dentro de una aplicación cocos2d. Por alguna razón, si reinicio la escena actual en el iPad, los niveles de micrófono devolverán los valores correctos.
¿Alguien tiene alguna sugerencia? Estoy realmente perdido aquí. Gracias!
Tal vez le ayudará a http://stackoverflow.com/questions/24991908/why-does-averagepowerforchannel-always-return-160 –