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 correct
, encoding 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];