問題タブ [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.
ios - ビデオ フレームの読み取り中に AVVideoComposition が失敗する
ソースビデオがあり、ソースビデオの各フレームの領域を取得して、そこから新しいビデオを生成したいと考えています。たとえば、解像度A
x B
、コンテンツ サイズX
x Y
、出力解像度C
xのビデオがある場合、元のビデオの各フレームの最初のxピクセルをコンテンツとする解像度xD
のビデオを作成します。C
D
X
Y
これを実現するためにAVAssetReader
、ソース ビデオの読み取りには を使用しAVAssetWriter
、新しいビデオの書き込みには を使用しています。ソース ビデオの領域X
xだけを抽出するために、アセット リーダーの出力としてオブジェクトを使用しています。セットアップ コードは次のようなものです。Y
AVAssetReaderVideoCompositionOutput
次に、ビデオ コンテンツをトリミングするためのロジックは、次のカスタム初期化子で発生します。
このコードは、コンテンツのサイズなど、場合によっては正常に機能します(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
手動でクロッピングを行う理由は、前者を使用するとアプリのメモリ フットプリントを削減できるためです。サイズ。これは、同時に複数のビデオを処理している場合に関係します。
ios - AVAssetReader を使用して mp4 ファイルを読み取ると、最初のオーディオ CMSampleBuffer が失われる
AVAssetWriter を使用してオーディオ CMSampleBuffer を mp4 ファイルに書き込んでいますが、後で AVAssetReader を使用してそのファイルを読み取ると、データの最初のチャンクが欠落しているようです。
ライターの入力追加メソッドに渡される最初の CMSampleBuffer のデバッグの説明を次に示します (1024/44_100 のプライミング期間のアタッチメントに注意してください)。
2 番目の CMSampleBuffer のデバッグの説明は次のとおりです (1088/44_100 のプライミング期間のアタッチメントに注意してください。前のトリム期間と組み合わせると、2112 の標準値が得られます)。
ここで、AVAssetReader を使用してオーディオ トラックを読み取ると、最初に取得する CMSampleBuffer は次のようになります。
次のものには、1088/44_100 のプライミング情報が含まれています。
入力追加メソッドはtrue
、原則としてすべてのサンプル バッファが追加されたことを意味しますが、何らかの理由でデータの最初のチャンクをスキップします。ここで私が間違っていることはありますか?
次のコードを使用してファイルを読み取ります。