31

私のアプリは現在 AVFoundation を使用して、iPhone の背面カメラから生のカメラ データを取得し、リアルタイムで AVCaptureVideoPreviewLayer に表示しています。

私の目標は、単純な画像フィルターを条件付きでプレビュー レイヤーに適用することです。画像は保存されないため、出力をキャプチャする必要はありません。たとえば、プレビュー レイヤーに入ってくるビデオを白黒に変換する設定を切り替えたいとします。

ここで、個々のビデオ フレームをバッファにキャプチャし、必要な変換を適用してから、各フレームを UIImage として表示することで、同様のことを達成しているように見える質問を見つけました。いくつかの理由から、これは私のプロジェクトにとってやり過ぎのように思えます。これが引き起こす可能性のあるパフォーマンスの問題を回避したいと考えています。

これが私の目標を達成する唯一の方法ですか?

前述したように、AVCaptureSession のビデオをキャプチャするつもりはなく、単にプレビューするだけです。

4

3 に答える 3

66

おそらく、これを処理する最も効率的な方法は、これらのビデオ フレームのフィルタリングと表示に OpenGL ES を使用することです。AVCaptureVideoPreviewLayer を直接使用して多くのことを行うことはできません。別のビューまたはレイヤーと重ね合わせたときに不透明度を調整することは別として。

ここでは、カメラからフレームを取得し、OpenGL ES 2.0 シェーダーを適用してビデオをリアルタイムで処理して表示するサンプル アプリケーションを用意しています。このアプリケーション (ここで詳しく説明されています) では、色ベースのフィルタリングを使用してカメラ ビュー内のオブジェクトを追跡していましたが、他の人はこのコードを変更して、いくつかの優れたビデオ処理効果を実行しました。画面に表示されるこのアプリケーションのすべての GPU ベースのフィルターは、iPhone 4 で 60 FPS で実行されます。

ビデオをサポートしているが、OpenGL ES 2.0 対応の GPU を搭載していない唯一の iOS デバイスは、iPhone 3G です。そのデバイスもターゲットにする必要がある場合は、ビデオ キャプチャと OpenGL ES テクスチャの生成のための基本コードを取得し、Apple のGLImageProcessingサンプル アプリケーションのフィルター コードを使用できる場合があります。このアプリケーションは OpenGL ES 1.1 を中心に構築されており、すべての iOS デバイスでサポートされています。

ただし、これには OpenGL ES 2.0 の使用を検討することを強くお勧めします。シェーダーを使用すると、固定機能の OpenGL ES 1.1 パイプラインよりも多くの種類の効果を引き出すことができるからです。

(編集: 2012 年 2 月 13 日) 上記の更新として、この種のカスタム イメージ フィルタリングをカプセル化するGPUImageというオープン ソース フレームワークを作成しました。また、ビデオのキャプチャとフィルター処理後の画面への表示も処理します。これらすべてを設定するには、わずか 6 行のコードしか必要ありません。フレームワークの詳細については、より詳細な発表をご覧ください。

于 2011-03-01T18:43:01.503 に答える