AVAssetReader读取音频,然后失败

时间:2011-04-25 05:37:15

标签: objective-c ios core-audio avfoundation avaudiosession

我的应用程序读取音频并在生产者/消费者设置中播放。消费者线程请求新样本呈现给硬件。生产者线程使用AVAssetReader将音频数据从磁盘读入其缓冲区。生产者线程在循环中运行,检查是否需要读取更多样本。制作人的缓冲区大小等于4秒的音频。

当我指示我的应用程序缓冲音频时,样本会成功读取而不会出错。当我触发我的生产者线程开始渲染音频时,4秒缓冲区完美播放,然后静音。进一步调查显示我的资产阅读器在开始播放时失败,因此在初始缓冲后没有其他样本读取:

CMSampleBufferRef ref = [readaudiofile copyNextSampleBuffer];
if (ref == NULL && filereader.status == AVAssetReaderStatusFailed) {
    NSLog(@"reader failed: %@", filereader.error);
}
// this produces: 
// {NSLocalizedFailureReason=An unknown error occurred (-12785), 
// NSUnderlyingError=0x161f60 "The operation couldn’t be completed. 
// (OSStatus error -12785.)", NSLocalizedDescription=The operation 
// could not be completed}

我的生产者线程代码与功能代码示例MusicLibraryRemoteIODemo相同。我的消费者线程代码是不同的,但我已经将这两行逐行比较了几天,似乎无法找到问题。知道可能导致AVAssetReader读取器失败的原因吗?

This post描述了类似的解决方案,并得出结论,音频会话需要正确设置(尽管它没有说明如何)。 AVAudioSesion配置和AVAssetReader的行为之间是否有任何关联?

1 个答案:

答案 0 :(得分:3)

我收到了同样的错误,我也在另一个帖子上发布了这个答案

- (void)setupAudio {
    [[AVAudioSession sharedInstance] setDelegate:self];
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error:&activationError];

    NSLog(@"setupAudio ACTIVATION ERROR IS %@", activationError);
    [[AVAudioSession sharedInstance] setPreferredIOBufferDuration:0.1 error:&activationError];
    NSLog(@"setupAudio BUFFER DURATION ERROR IS %@", activationError);
}