2011-02-03 16 views
2

私は、iPhoneカメラからライブビデオフレームを取得し、フラットOpenGLジオメトリにテクスチャとして適用して、カメラ入力の処理にシェーダを使用しています。処理されたテクスチャを取得してムービーファイルに保存することができるかどうかは誰にも知られていますか?OpenGL ES:一連のテクスチャをムービーファイルとして保存

これは多くの処理能力を必要とするようですが、進歩するための最善の方法が何であるか、あるいはそれが可能であるかどうかはわかりません。ここでの動機付けは、カメラから取得したビデオに興味深いシェーダ効果を加え、結果を保存して他の人と共有できるようにすることです。

あなたの考えを前もっておねがいします。

答えて

5

私は、パフォーマンスへとコメントし、しかし、あなたがやりたいことはありません。

  • 入ってくるサンプルを採取し、H.264でそれらを書き込むことができる(AVAssetWriterを作成し、他のファイル形式には思えません現在のiOSリリースでサポートされるように)
  • AVAssetWriterInputをアセットライターに添付してビデオフレームを提供します(アセットライターは、アセットのさまざまな側面を提供する1つ以上の入力を取ります)。
  • アセットライター入力にAVAssetWriterInputPixelBufferAdaptorを添付すると、入力でピクセルバッファーを押すことができます。資産ライターの入力にメディアデータをリアルタイムで期待することを伝えたいと思うでしょう。そうすることで、常に入力の準備ができていることがわかります。フレームタイミングの指定は、フレームの供給時およびフレーム指定時に行われるため、コードの残りの部分にはパフォーマンス要件は適用されません。

そこから、CVImageBuffersをピクセルバッファーアダプタにプッシュするだけです。 OS Xには便利なCore Video OpenGLバッファタイプがありますが、iOSには欠けているようです。代わりにglReadPixelsCVPixelBufferCreateなどが必要です。ピクセルバッファをロックし、そのベースアドレスに直接書き込みます。その間にバイトをシャッフルする必要なしに、OpenGLに直接渡すことができることを期待しています。

iPhoneに専用のH.264エンコーダがあるとすると、主なパフォーマンスのボトルネックはglReadPixelsである可能性が高く、フレームバッファにあるものはすべてCPUに転送して再フォーマットする必要があります。すべてを設定して結果が遅いように見える場合は、最初に調査します。

+0

'glReadPixels'と' CVPixelBuffer'はうまく動作します。私が持っている問題は「オフ」の色しかないということです。 CVPixelBufferで使われている 'glReadPixels'とBGRAに渡される' GL_RGBA'によると思います。これらのピクセルフォーマットに関する考え方や、これをどのように修正することができますか? – MrDatabase

+0

仕様を読んだところ、AppleのBGRA拡張機能はBGRAのアップロードを追加するようだが、ダウンロードはできないようだ。 GL_BGRAに 'glReadPixels'というショットを付けることができますが、私は楽観的ではありません。私はあなたがAV Foundationにバッファを渡す前にチャネルスワップを行う必要があると思います。おそらくテクスチャにレンダリングしてユーザに表示し、rとbを反転するように図示していないバッファにレンダリングすることで、おそらくGPUで行うのが最も安いでしょう。それは複雑に聞こえますが、iOS 5ではCoreVideoイメージをOpenGLに簡単に取り込めるようにする 'CVOpenGLESTexture'が追加されています。 – Tommy

関連する問題