iOS – 录制audio播放失败,OSStatus错误-43(找不到文件)

我加载视图时,按以下方式设置AVAudioRecorder实例:

AVAudioSession *audioSession = [AVAudioSession sharedInstance]; audioSession.delegate = self; [audioSession setActive:YES error:nil]; [audioSession setCategory:AVAudioSessionCategoryRecord error:nil]; NSString *tempDir = NSTemporaryDirectory(); NSString *soundFilePath = [tempDir stringByAppendingPathComponent:@"sound.m4a"]; NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; NSLog(@"%@", soundFileURL); NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVFormatIDKey, [NSNumber numberWithInt:AVAudioQualityMin], AVEncoderAudioQualityKey, [NSNumber numberWithInt:16], AVEncoderBitRateKey, [NSNumber numberWithInt: 1], AVNumberOfChannelsKey, [NSNumber numberWithFloat:8000.0], AVSampleRateKey, [NSNumber numberWithInt:8], AVLinearPCMBitDepthKey, nil]; NSError *error = nil; self.recorder = [[AVAudioRecorder alloc] initWithURL:soundFileURL settings:recordSettings error:&error]; self.recorder.delegate = self; if (error) { NSLog(@"error: %@", [error localizedDescription]); } else { [self.recorder prepareToRecord]; } 

然后,当用户按下loggingbutton时,我这样做:

 - (IBAction)record:(id)sender { if (!self.isRecording) { self.isRecording = YES; [self.recorder record]; self.recordButton.enabled = NO; } } 

然后停止录制/播放:

 - (IBAction)stop:(id)sender { if (self.isRecording) { [self.recorder stop]; self.recordButton.enabled = YES; self.isRecording = NO; } if (self.isPlaying) { [self.player stop]; self.isPlaying = NO; self.playButton.enabled = YES; } } 

之后,我希望能够回放录制的内容,所以我做了以下操作:

 - (IBAction)play:(id)sender { NSError *error = nil; self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:self.recorder.url error:&error]; self.player.delegate = self; if (error) { NSLog(@"%@", error.localizedDescription); } else { self.isPlaying = YES; [self.player play]; self.playButton.enabled = NO; } } 

但是当我去玩文件是得到OSStatus错误-43文件没有find。

这一切都在设备上运行,在模拟器上尝试实例化logging器或播放器时出现错误,从我看过这是一个模拟器问题。

编辑1:我解决了OSStatus错误-43部分它与编码格式有关,我注释了格式,它logging和正确播放文件,但我需要以压缩格式进行logging。 有谁知道这个设置?

编辑2:我设法find压缩的AACaudio工作的设置。 一个2分钟的audio文件出来到256KB,我更新了我的代码,以反映当前的状态。 感谢所有为你提供帮助的人。

编辑:现在有(我没有太多的iOSaudio经验),但… …我会采取一个野蛮刺在此,因为没有人回答(编辑:现在有)

尝试改变

 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil]; 

 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 

AVEncoderBitRateKey不能与AAC格式的编码一起使用。所以试试这个代码。

 NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; NSLog(@"%@", soundFileURL); NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVFormatIDKey, [NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey, [NSNumber numberWithInt: 1], AVNumberOfChannelsKey, [NSNumber numberWithFloat:44100.0], AVSampleRateKey, nil]; NSError *error = nil; self.recorder = [[AVAudioRecorder alloc] initWithURL:soundFileURL settings:recordSettings error:&error]; self.recorder.delegate = self; if (error) { NSLog(@"error: %@", [error localizedDescription]); NSLog(@"error: %@", [error description]); } else { [self.recorder prepareToRecord]; } 

编辑1:

OSStatus错误-43文件未find不是模拟器问题。 这是错误日志,显示您的recording settings are not correctencoding format is not supported for the settings you have selected所需的encoding format is not supported for the settings you have selected

当你得到这个错误时,你的文件将按照你提供的格式创build。 但它not initialize your audio recorder to start recording 。 如果您有任何疑问,请select您在第一个问题中的相同设置并录制,然后尝试播放该设置。 由于不受支持的设置,它不会logging和播放。

因此,对于compressed encoding format ,您可以使用我在上面给出的代码中的设置。 您可以使用.aac格式进行此设置。 164KB per 10 seconds to record in aac需要164KB per 10 seconds to record in aac格式164KB per 10 seconds to record in aac 。 其余的格式,你必须尝试找出。

您可能需要将AVAudioSession类别设置回播放模式:

 NSError *_error = nil; [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&_error]; if (_error) { // handle error here } 

这也应该避免在静音开关打开时audio不能播放的问题。

好的试试这个:

soundFileURL = [NSURL fileURLWithPath:soundFilePath];而不是NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];

然后改变这个

 self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:self.recorder.url error:&error]; 

对此

 self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:&error];