私は、パフォーマンスへとコメントし、しかし、あなたがやりたいことはありません。
- 入ってくるサンプルを採取し、H.264でそれらを書き込むことができる(
AVAssetWriter
を作成し、他のファイル形式には思えません現在のiOSリリースでサポートされるように)
AVAssetWriterInput
をアセットライターに添付してビデオフレームを提供します(アセットライターは、アセットのさまざまな側面を提供する1つ以上の入力を取ります)。
- アセットライター入力に
AVAssetWriterInputPixelBufferAdaptor
を添付すると、入力でピクセルバッファーを押すことができます。資産ライターの入力にメディアデータをリアルタイムで期待することを伝えたいと思うでしょう。そうすることで、常に入力の準備ができていることがわかります。フレームタイミングの指定は、フレームの供給時およびフレーム指定時に行われるため、コードの残りの部分にはパフォーマンス要件は適用されません。
そこから、CVImageBuffersをピクセルバッファーアダプタにプッシュするだけです。 OS Xには便利なCore Video OpenGLバッファタイプがありますが、iOSには欠けているようです。代わりにglReadPixels
とCVPixelBufferCreate
などが必要です。ピクセルバッファをロックし、そのベースアドレスに直接書き込みます。その間にバイトをシャッフルする必要なしに、OpenGLに直接渡すことができることを期待しています。
iPhoneに専用のH.264エンコーダがあるとすると、主なパフォーマンスのボトルネックはglReadPixelsである可能性が高く、フレームバッファにあるものはすべてCPUに転送して再フォーマットする必要があります。すべてを設定して結果が遅いように見える場合は、最初に調査します。
'glReadPixels'と' CVPixelBuffer'はうまく動作します。私が持っている問題は「オフ」の色しかないということです。 CVPixelBufferで使われている 'glReadPixels'とBGRAに渡される' GL_RGBA'によると思います。これらのピクセルフォーマットに関する考え方や、これをどのように修正することができますか? – MrDatabase
仕様を読んだところ、AppleのBGRA拡張機能はBGRAのアップロードを追加するようだが、ダウンロードはできないようだ。 GL_BGRAに 'glReadPixels'というショットを付けることができますが、私は楽観的ではありません。私はあなたがAV Foundationにバッファを渡す前にチャネルスワップを行う必要があると思います。おそらくテクスチャにレンダリングしてユーザに表示し、rとbを反転するように図示していないバッファにレンダリングすることで、おそらくGPUで行うのが最も安いでしょう。それは複雑に聞こえますが、iOS 5ではCoreVideoイメージをOpenGLに簡単に取り込めるようにする 'CVOpenGLESTexture'が追加されています。 – Tommy