La corruption de files apparemment random en utilisant AVAudioRecorder (parfois le file ne peut pas être lu) – iOS

Dans une application que je développe actuellement, j'ai plus ou less frappé un mur de briques. Dans l'application, vous pouvez entrer une vue qui répertorie tous les files audio enregistrés localement dans une vue de tableau standard. De là, vous pouvez cliquer dessus pour les lire, ou appuyer sur un button d'logging ci-dessous pour faire un nouvel logging, qui sera ensuite automatiquement enregistré dans le sandbox des applications.

Maintenant, tout cela fonctionne parfaitement bien, la plupart du time. Je peux m'asseoir et faire des loggings et les rejouer. Je peux m'asseoir et tester cela encore et encore pour environ 45 ans sans aucun problème. Puis soudainement à des moments randoms, je vais bash un problème très étrange. Le problème est que l'enregistreur commence tout d'un coup à ne sauver que des files corrompus qui ne peuvent pas être lus et ont une taille de 4096 octets, peu importe la durée de l'logging.

J'utilise le AVAudioRecorder de manière totalement standard, en le configurant comme ceci:

// 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; 

Je commence l'logging comme ceci:

 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]; } 

Et puis l'arrêter avec ceci:

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

Je n'ai aucune idée de ce qui pourrait causer ce problème. Jusqu'à présent, j'ai presque tout essayé. J'ai vérifié que l'object de l'enregistreur est recykey correctement (donc vous avez une nouvelle instance pour chaque logging), et que l'ancienne reference est désallouée et ainsi de suite, pour s'assurer que cela n'a rien à voir avec les objects interférents, mais rien ne le résout.

Y at-il quelqu'un qui a une idée de ce qui pourrait causer des problèmes avec des files corrompus?

Note: Puisque le PO est inactif pendant quelques jours et je suppose que cette question devrait être répondue pour la reference future du public, ainsi je publie cette réponse.

L' AVAudioSession doit être obtenue avant de commencer l'logging.

 AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 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; } 

Référence: https://stackoverflow.com/a/9706731/188331