AVAudioRecorder Record方法随机返回NO

我目前正在开发一款支持应用内audio录制的应用程序。 用户可以通过应用程序获得本地保存的audio文件的标准桌面视图,或者按下button进入新的录制视图,从那里可以录制新的audio会话,该会话将自动获得保存到应用程序沙箱。 现在这个function大部分时间都运行良好。 我可以录制新文件并从应用程序中播放它们,但随机时刻录音机将无法使用此方法开始录制:

-(void) startRecording { if (!isRecording) { isRecording = YES; BOOL recordingSucess = [audioRecorder record]; if (recordingSucess) NSLog(@"WE STARTED THE RECORDING!"); else NSLog(@"WE DID NOT START THE RECORDING!"); // Start the timer recordTiming = [NSDate date]; timeCheck = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timeCheck) userInfo:nil repeats:YES] } 

也就是说,NSLog会打印出“我们没有开始logging”,表示没有开始logging。 这导致一个空的audio文件仍然被保存到应用程序与恒定的文件大小正好4096字节。 这是audiologging器对象如何初始化的:

 -(id) initWithContentURL:(NSURL *)contentURL { self = [super init]; if (self) { NSLog(@"Initializing audio recorder!"); // 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; } 

还有NSLog检查检查是否错误是零,所以在这一点上,我确信初始化似乎没有失败。 究竟什么原因可能导致logging方法在看似随机的时候失败,而在大多数情况下,这种方法是完美的呢?

录音开始之前,audio会话应该被初始化:

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

请参阅接受的答案以供参考。

contentURL总是一样的,还是每次都生成一个新的?

你也可以尝试显式调用prepareToRecord之前logging和检查是否成功?