私は、ディスクからメディアデータを読み取り、適切なピクセル形式に変換してから、圧縮してディスクに書き込むために AVAssetWriter に渡すアプリに取り組んでいます。AVAssetReaderを使用せずに、インターリーブを自分で読んでいます。私のリーダーは、正確に 1 フレーム分のビデオ データと 1 フレーム分のオーディオ データが連続して表示されるようにします。私が抱えている問題は、expectedMediaDataInRealTime プロパティをYESに設定しないと、ビデオ アセット ライターが常にNOを返すことです。正確に 30 フレーム後の isReadyForMoreMediaData の場合。30 フレームの前に書き込みを停止すると、正常に動作し、出力ファイルは有効になります。ただし、expectsMediaDataInRealTime を YES に設定すると、数千フレームになる可能性がある全期間にわたって完全に機能します。expectsMediaDataInRealTime を YES に設定してトランスコード操作を開始した後、非常に長いビデオを圧縮する過程でアプリのメモリ使用量を監視しましたが、不当なメモリ使用量やメモリ リークはありませんでした。そして、結果の MOV ファイルはかなり正常に書き込まれたように見えました。たとえば、予想どおり、オーディオ データがビデオ データとインターリーブされていました。
では、expectsMediaDataInRealTime を YES に設定する明らかな欠点がないのに、なぜ NO に設定するのでしょうか? これは、Apple API を使用して (AVAssetReader を使用して) データを読み取る場合にのみ適用されますか? ドキュメントによると、このプロパティは「ストレージと再生を効率化するための理想的なインターリーブ パターンでのメディア データ」の書き込みを制御しますが、expectsMediaDataInRealTime が YES に設定されている場合、isReadyForMoreMediaData は NO を返すことはなく、ファイルは完全に書き込まれているように見えます。では、このプロパティが YES に設定されているときに AVAssetWriter がこれを実行できるのであれば、NO に設定されているときに実行できないのはなぜでしょうか? ソースは全く同じです。
このプロパティは、「readyForMoreMediaData の値が適切に計算されるようにする」以外に、正確には何をしますか (これは、私にはまったく意味がありません)。