9

私は、ディスクからメディアデータを読み取り、適切なピクセル形式に変換してから、圧縮してディスクに書き込むために 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 の値が適切に計算されるようにする」以外に、正確には何をしますか (これは、私にはまったく意味がありません)。

4

2 に答える 2

0

私の理解では、expectsMediaDataInRealTime を YES に設定すると、エンコーダーがカメラなどのリアルタイム データ ストリーム フィードを期待していることを意味します。エンコーダーに。isReadyForMoreMediaData が NO の場合は、現在のサンプルをドロップし、次のサンプルが到着するまで待ってから、isReadyForMoreMediaData が YES かどうかを再度確認する必要があります。

一方、expectsMediaDataInRealTime が NO の場合は、エンコーダーがリアルタイム ソースではなく、AVAssetReader などのオフライン データ ストリームを取得していることを意味します。この場合、フロー速度を自分で制御できるため、isReadyForMoreMediaData が NO の場合は、入力とエンコーダーを保持して、isReadyForMoreMediaData が YES になるまで待機することができます (たとえば、無限ループを使用してスリープし、isReadyForMoreMediaData を待機します)。変更など)。

これの目的は、内部メカニズムがオーディオとビデオのタイムスタンプを可能な限り揃えてインターリーブしようとするためだと思います。したがって、プレーヤー、デコーダーが再生のために多くのデータをプリフェッチする必要はありません。これは、データ ソース側のデータの整合性と再生側のエクスペリエンスとの間の妥協点です。とはいえ、expectsMediaDataInRealTime を常に YES に使用できると思いますが、isReadyForMoreMediaData==NO の場合は、早期にフィードされたサンプルを破棄することをお勧めします。

于 2016-03-15T13:09:59.403 に答える