使用CIImage进行实时过滤时,降低视频质量以获得更高的FPS

时间:2011-12-30 10:26:40

标签: iphone ios cocoa-touch opengl-es

我正在尝试像Instagram和Path那样进行实时相机过滤。因为我不够熟练地处理OpenGL ES。我改用iOS 5的CoreImage。

我使用此回调方法拦截并过滤相机中的每个帧:

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

我使用的会话预设是 AVCaptureSessionPresetPhoto ,因为我最终需要拍摄高质量的照片。

如果我只是在没有任何CIImage过滤的情况下将缓冲区显示在屏幕上,则平均FPS将达到 26 甚至更高,这很好。

如果我开始将一些CIF过滤器应用于图像数据,则FPS将降至 10 甚至更低。现场视频开始看起来很糟糕。

我知道Instagram和Path会直接使用OpenGL ES,而不是像CoreImage那样包装框架,这样他们就可以构建更高效的GPU渲染代码。同时,我还注意到Instagram实际上降低了样本视频质量,以进一步降低GPU负担。下面是我的应用程序(左)和Instagram(右)都捕获实时视频时的截图。请注意两张图片中的字母 Z S 。你可以看到Instagram的视频质量略低于我的。

所以现在我正在考虑各种降低实时视频帧质量的方法。但我真的不知道哪条路更好。我应该如何实现它。

  1. 在将其转换为CIImage对象之前,尝试减少此(CMSampleBufferRef)sampleBuffer 的质量。
  2. 尝试从CIImage或CIFilter或CIContext中查找一些API以降低视频帧质量。
  3. 尝试从OpenGL ES中查找一些API以降低视频帧质量。
  4. 同样,我现在没有任何线索。所以任何建议都将不胜感激!

    enter image description here

2 个答案:

答案 0 :(得分:0)

AVcaptureSession具有sessionPreset属性,可以将视频质量设置为低或中等。

以下代码将质量设置为中等。

[self.mSession setSessionPreset:AVCaptureSessionPresetMedium];

答案 1 :(得分:0)

如果您不愿意降低视频质量(我认为AVCaptureSessionPresetPhoto相当低),您最好的选择是优化滤镜或降低帧速率。

您可能会认为,我已经获得了较低的帧速率。但是,提前设置将优化帧的丢弃方式。因此,如果您现在获得10fps,请尝试将最大帧速率设置为15,然后您可能只需要15. 15fps非常适合预览。

(我已经在Flare上工作了一个最苛刻的应用程序itun.es/iLQ3bR。)