私は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(右)が両方ともライブビデオをキャプチャしているときに撮ったスクリーンショットです。どちらの写真にもZとSという文字に注意してください。 Instagramのビデオ品質は私のものよりわずかに低いことがわかります。
今、私はライブビデオフレームの品質を下げるさまざまな方法を検討しています。しかし、私は本当にどちらの方法が良いかわからない。そして私はそれをどのように実装するべきですか?
- はCIImageオブジェクトに変換する前にこの(CMSampleBufferRef)sampleBufferの品質を低下させるようにしてください。
- ビデオフレームの品質を下げるために、CIImageまたはCIFilterまたはCIContextからいくつかのAPIを見つけようとします。
- OpenGL ESからいくつかのAPIを見つけてビデオフレームの品質を下げてみてください。
もう一度、私は今のところ手掛かりはありません。だから、どんな提案も大歓迎です!
私が述べたように、私は最終的に、高品質の写真を撮るために、このセッションを使用する必要があります。さらに、動的に切り替えるプリセットの時間的なペナルティは大きい。したがって、AVCaptureSessionPresetPhoto以外のプリセットは問題になりません。 –