看似随机文件损坏使用AVAudioRecorder(有时文件不能播放) – iOS

在我正在开发的应用程序中,我或多或less地碰到了一堵砖墙。 在应用程序中,您可以input一个视图,在标准表视图中列出所有本地保存的audio文件。 从这里你可以点击它们来播放它们,或者点击下面的一个loggingbutton来创build一个新的logging,然后自动保存到应用程序沙箱中。

现在所有这些在大多数情况下都可以很好地工作。 我可以坐下来做录音,然后回放。 我可以一直坐下来testing,大约45分钟,没有任何问题。 然后突然在随机的时候,我会遇到一个非常奇怪的问题。 问题在于,logging器突然开始只保存无法播放的损坏文件,无论多长时间录制,其大小都是4096字节。

我以完全标准的方式使用AVAudioRecorder,如下所示:

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

我开始这样的录音:

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

然后停下来这个:

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

我不知道是什么原因可能导致这个问题发生。 到目前为止我已经尝试了几乎所有 我已经检查过,以确保logging器对象被正确地回收(所以现在每个logging都有一个新的实例),并且旧的引用被解除分配等等,以确保它与干扰对象无关,但没有解决它。

有没有人对可能导致文件损坏的问题有一些了解?

注意:由于OP在一些日子里是不活跃的,我想这个问题应该回答公众的未来的参考,因此我张贴这个答案。

AVAudioSession必须在开始录制之前获得。

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

参考: https : //stackoverflow.com/a/9706731/188331