問題タブ [avassetreader]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
299 参照

ios - ビデオ フレームの読み取り中に AVVideoComposition が失敗する

ソースビデオがあり、ソースビデオの各フレームの領域を取得して、そこから新しいビデオを生成したいと考えています。たとえば、解像度Ax B、コンテンツ サイズXx Y、出力解像度Cxのビデオがある場合、元のビデオの各フレームの最初のxピクセルをコンテンツとする解像度xDのビデオを作成します。CDXY

これを実現するためにAVAssetReader、ソース ビデオの読み取りには を使用しAVAssetWriter、新しいビデオの書き込みには を使用しています。ソース ビデオの領域Xxだけを抽出するために、アセット リーダーの出力としてオブジェクトを使用しています。セットアップ コードは次のようなものです。YAVAssetReaderVideoCompositionOutput

次に、ビデオ コンテンツをトリミングするためのロジックは、次のカスタム初期化子で発生します。

このコードは、コンテンツのサイズなど、場合によっては正常に機能します(origin = (x = 0, y = 0), size = (width = 1416, height = 1920))。ただし、幅を 1417 に変更すると機能せず、次のエラー メッセージが表示されます。

Error Domain=AVFoundationErrorDomain Code=-11858 "Source frame unsupported format" UserInfo={NSUnderlyingError=0x283e689c0 {Error Domain=NSOSStatusErrorDomain Code=-12502 "(null)"}, NSLocalizedFailureReason=ビデオを合成できませんでした., NSDebugDescription=ソース フレームサポートされていない形式、NSLocalizedDescription=操作停止}

これは、エラーが発生したテスト ビデオを含むサンプル プロジェクトへのリンクです。幅1416、1421、1422、1423、1429で機能し、1416と1429の間の他のすべての幅値で失敗するため、これがランダムに見える場合があります。ここで何が問題で、どうすれば問題を解決できますか?

なぜこのアプローチを使用するのですか?

を使用するAVAssetReaderVideoCompositionOutput代わりに を使用してAVAssetReaderTrackOutput手動でクロッピングを行う理由は、前者を使用するとアプリのメモリ フットプリントを削減できるためです。サイズ。これは、同時に複数のビデオを処理している場合に関係します。

0 投票する
1 に答える
417 参照

ios - AVAssetReader を使用して mp4 ファイルを読み取ると、最初のオーディオ CMSampleBuffer が失われる

AVAssetWriter を使用してオーディオ CMSampleBuffer を mp4 ファイルに書き込んでいますが、後で AVAssetReader を使用してそのファイルを読み取ると、データの最初のチャンクが欠落しているようです。

ライターの入力追加メソッドに渡される最初の CMSampleBuffer のデバッグの説明を次に示します (1024/44_100 のプライミング期間のアタッチメントに注意してください)。

2 番目の CMSampleBuffer のデバッグの説明は次のとおりです (1088/44_100 のプライミング期間のアタッチメントに注意してください。前のトリム期間と組み合わせると、2112 の標準値が得られます)。

ここで、AVAssetReader を使用してオーディオ トラックを読み取ると、最初に取得する CMSampleBuffer は次のようになります。

次のものには、1088/44_100 のプライミング情報が含まれています。

入力追加メソッドはtrue、原則としてすべてのサンプル バッファが追加されたことを意味しますが、何らかの理由でデータの最初のチャンクをスキップします。ここで私が間違っていることはありますか?

次のコードを使用してファイルを読み取ります。