2

私のアプリはオーディオを読み取り、プロデューサー/コンシューマー設定で再生します。コンシューマースレッドは、ハードウェアにレンダリングする新しいサンプルを要求します。プロデューサースレッドは、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と同じです。私のコンシューマースレッドコードは異なりますが、2行ずつ2日間比較したところ、問題が見つからないようです。AVAssetReaderリーダーが失敗する原因は何でしょうか。

この投稿では、同様の解決策について説明し、オーディオセッションを適切に設定する必要があると結論付けました(方法については説明していませんが)。AVAudioSesionの構成とAVAssetReaderの動作の間に関係はありますか?

4

1 に答える 1

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);
}
于 2011-05-06T18:40:02.290 に答える