Al parecer, la corrupción de files aleatorios mediante AVAudioRecorder (A veces, el file no se puede reproducir) – iOS

En una aplicación que actualmente estoy desarrollando, he golpeado más o less un muro de ladrillos. En la aplicación puede ingresar una vista que enumera todos los files de audio guardados localmente en una vista de tabla estándar. Desde aquí puede hacer clic en ellos para reproducirlos, o pulsar un button de grabación a continuación para realizar una nueva grabación, que luego se saveá automáticamente en el entorno limitado de aplicaciones.

Ahora todo esto funciona perfectamente bien, la mayoría de las veces. Puedo sentarme y hacer grabaciones y reproducirlas. Puedo sentarme y probar esto una y otra vez por alnetworkingedor de 45 sin ningún problema. Entonces, de repente, en ocasiones aleatorias, llegaré a un problema muy extraño. El problema es que, de repente, la grabadora comienza a save nada más que files corruptos que no se pueden reproducir y tienen exactamente 4096 bytes de tamaño, independientemente de la duración de su grabación.

Utilizo AVAudioRecorder de una manera totalmente estándar, configurándolo así:

// Specific settings for the audio recording NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:AVAudioQualityMin], AVEncoderAudioQualityKey, [NSNumber numberWithInt:8], AVEncoderBitRateKey, [NSNumber numberWithInt: 2], AVNumberOfChannelsKey, [NSNumber numberWithFloat:22000.0], AVSampleRateKey, nil]; NSError *error = nil; audioRecorder = [[AVAudioRecorder alloc] initWithURL:contentURL settings:recordSettings error:&error]; audioRecorder.delegate = self; 

Empiezo la grabación así:

 if (!isRecording) { isRecording = YES; [audioRecorder record]; // Start the timer recordTiming = [NSDate date]; timeCheck = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timeCheck) userInfo:nil repeats:YES]; } 

Y luego deteniéndolo con esto:

 if (isRecording) { [audioRecorder stop]; // Stop the timer [timeCheck invalidate]; } 

No tengo idea de qué podría hacer que este problema ocurra. Hasta ahora he probado casi todo. He comprobado que el object de la grabadora se recicle correctamente (para que tenga una nueva instancia para cada grabación) y que la reference anterior se desasigne y así sucesivamente, para asegurarse de que no tenga nada que ver con los objects que interfieren, pero nada lo resuelve.

¿Hay alguien que tenga una ligera idea de lo que podría causar problemas con files dañados?

Nota: Dado que el OP está inactivo durante algunos días y supongo que esta pregunta debe responderse para reference futura del público, por lo tanto, publico esta respuesta.

La AVAudioSession debe getse antes de comenzar a grabar.

 AVAudioSession *audioSession = [AVAudioSession shanetworkingInstance]; NSError *err = nil; [audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err]; if(err){ NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]); return; } err = nil; [audioSession setActive:YES error:&err]; if(err){ NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]); return; } 

Referencia: https://stackoverflow.com/a/9706731/188331