2011-12-30 12 views
0

私はInstagramとPathのようなライブカメラフィルタを実行しようとしています。私はOpenGL ESを扱うほど熟練していないからです。代わりにiOS 5のCoreImageを使用します。私は最終的に高品質の写真を取る必要があるので、私が使用CIImageを使用したライブフィルタリング時の高画質化のためのビデオ品質の低下

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { 

セッションプリセットがAVCaptureSessionPresetPhoto次のとおりです。

は私がインターセプトして、カメラから各フレームをフィルタリングするために、このコールバックメソッドを使用します。

CIImageフィルタリングなしで画面にバッファを表示すると、平均FPSは以上になります。これはさらに優れています。

イメージデータに一部のCIFilterを適用すると、FPSはまたはそれ以下の値まで低下します。ライブビデオは悪く見えるだろう。

InstagramとPathは、CoreImageなどのラップされたフレームワークではなく、OpenGL ESを直接使用するため、GPUレンダリング用のより効率的なコードを作成できることを理解しています。同時に、私はInstagramがサンプルビデオの品質を実際に下げてGPUの負担をさらに軽減することにも気付きました。以下は、私のアプリ(左)とInstagram(右)が両方ともライブビデオをキャプチャしているときに撮ったスクリーンショットです。どちらの写真にもZSという文字に注意してください。 Instagramのビデオ品質は私のものよりわずかに低いことがわかります。

今、私はライブビデオフレームの品質を下げるさまざまな方法を検討しています。しかし、私は本当にどちらの方法が良いかわからない。そして私はそれをどのように実装するべきですか?

  1. はCIImageオブジェクトに変換する前にこの(CMSampleBufferRef)sampleBufferの品質を低下させるようにしてください。
  2. ビデオフレームの品質を下げるために、CIImageまたはCIFilterまたはCIContextからいくつかのAPIを見つけようとします。
  3. OpenGL ESからいくつかのAPIを見つけてビデオフレームの品質を下げてみてください。

もう一度、私は今のところ手掛かりはありません。だから、どんな提案も大歓迎です!

enter image description here

答えて

0

AVcaptureSessionビデオ品質が低、中または高に設定できるようにするプロパティsessionPresetを持っています。

以下のコードセットの品質は中程度です。あなたは(と私はAVCaptureSessionPresetPhotoはとにかくかなり低いと思う)ビデオ品質を低下させるために不本意なら

[self.mSession setSessionPreset:AVCaptureSessionPresetMedium]; 
+0

私が述べたように、私は最終的に、高品質の写真を撮るために、このセッションを使用する必要があります。さらに、動的に切り替えるプリセットの時間的なペナルティは大きい。したがって、AVCaptureSessionPresetPhoto以外のプリセットは問題になりません。 –

0

、あなたの最善の策は、どちらかあなたのフィルタを最適化する、またはフレームレートを下げています。

あなたは既に、フレームレートが低下していると思います。ただし、これを事前に設定すると、フレームのドロップ方法が最適化されます。したがって、現在10fpsを取得している場合は、最大フレームレートを15と設定してみてください.15fpsはプレビューには十分です。

(私はそこに、最も要求の厳しいアプリケーションアウトitun.es/iLQ3bRの一つに、Flareに働いてきた。)

関連する問題