iOS - 播放录制的音频失败并出现 OSStatus 错误 -43(未找到文件)
Posted
技术标签:
【中文标题】iOS - 播放录制的音频失败并出现 OSStatus 错误 -43(未找到文件)【英文标题】:iOS - Playback of recorded audio fails with OSStatus error -43 (file not found) 【发布时间】:2012-04-18 21:25:37 【问题描述】:当我的视图加载时,我通过以下方式设置了一个 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];
然后,当用户按下录制按钮时,我会这样做:
- (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 error -43 找不到文件。
顺便说一句,这一切都在设备上运行,在模拟器上尝试实例化记录器或播放器时出现错误,从我看来这是一个模拟器问题。
编辑 1: 我解决了 OSStatus 错误 -43 部分它与编码格式有关,我将格式注释掉并正确记录和播放文件,但我需要记录以压缩格式。有谁知道这个的设置吗?
编辑 2: 我设法找到了适用于压缩 AAC 音频的设置。一个 2 分钟的音频文件大小为 256KB,我更新了代码以反映当前状态。感谢所有回答您的帮助的人。
【问题讨论】:
也许该文件仍在被录音机使用,因此无法读取? (不过只是在黑暗中刺伤) 我相信在这种情况下会产生错误,当我点击停止时,记录器会停止,所以我非常怀疑。 对不起,如果我对此有点错误,因为我几乎没有使用任何与音频相关的课程,但是有[self.player prepareToPlay]
吗?
问题:您是在设备上测试还是在模拟器中测试?如果是设备,是哪一个?
这是在设备上,iPhone 4 和 iOS 5.1
【参考方案1】:
由于没有其他人回答(编辑:现在有)(我对 iOS 中的音频没有太多经验),所以我将对此进行疯狂的尝试,但是...
尝试改变
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil];
到
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
【讨论】:
是的,这可能会阻止我在回答中提到的将类别更改回播放的需要。 刚刚注意到这一点,我确实在我的代码中将其设置为 PlayAndRecord,但我将其设置回记录方法中(愚弄我)。编辑我的代码以反映更改。仍然像白噪声一样。 修改它,现在我得到文件未找到错误。它似乎没有创建音频文件。【参考方案2】: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 文件 不是模拟器问题。这是一个错误日志,显示您的recording settings are not correct
和必需的encoding format is not supported for the settings you have selected
。
当您收到此错误时,您的文件将以您给定的格式创建。但它会not initialize your audio recorder to start recording
。如果您有任何疑问,请选择与第一个问题相同的设置并录制并尝试播放。由于设置不受支持,无法录制和播放。
所以对于compressed encoding format
,您可以使用我上面在代码中给出的设置。您可以为此设置使用.aac
格式。它将采用164KB per 10 seconds to record in aac
格式。对于其他格式,您必须尝试弄清楚。
【讨论】:
我看到了你的新代码。你的编码格式是 kAudioFormatMPEG4AAC ,你的扩展名是 .m4a 。我以为你需要 .aac 扩展文件。为此,请使用此代码。会很好的。 我看到了错误,但只是在模拟器上。当我停止使用 AVEncoderBitRateKey 时,它工作得很好。谢谢!【参考方案3】:您可能需要将 AVAudioSession 类别设置回播放模式:
NSError *_error = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&_error];
if (_error)
// handle error here
这也应该避免在打开静音开关时无法播放音频的问题。
【讨论】:
为此编辑了我的代码,没有注意到我没有这样做,现在我收到 OSStatus 错误 -43(找不到文件) 请注意,您应该测试“setCategory:error: 是否返回 YES 或 NO,而不是测试 error 是否为 nil。【参考方案4】:好的,试试这个:
为您的班级设置NSURL *soundFileURL
全局,以便您可以在班级的任何地方访问它,并以与现在相同的方式进行设置(除了它将是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];
【讨论】:
以上是关于iOS - 播放录制的音频失败并出现 OSStatus 错误 -43(未找到文件)的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式在 iOS 中录制的音频无法在 Windows 中播放