私のアプリはオーディオを読み取り、プロデューサー/コンシューマー設定で再生します。コンシューマースレッドは、ハードウェアにレンダリングする新しいサンプルを要求します。プロデューサースレッドは、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の動作の間に関係はありますか?