使用 CIImage 进行实时过滤时降低视频质量以获得更高的 FPS
Posted
技术标签:
【中文标题】使用 CIImage 进行实时过滤时降低视频质量以获得更高的 FPS【英文标题】:Lower the Video Quality for Higher FPS When Live Filtering Using CIImage 【发布时间】:2011-12-30 10:26:40 【问题描述】:我正在尝试制作像 Instagram 和 Path 这样的实时相机滤镜。因为我不够熟练,无法处理 OpenGL ES。我改用 ios 5 的 CoreImage。
我使用这个回调方法来截取和过滤来自相机的每一帧:
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
我使用的会话预设是AVCaptureSessionPresetPhoto,因为我最终需要拍出高质量的照片。
如果我只是将缓冲区呈现给屏幕而不进行任何 CIImage 过滤,则平均 FPS 将达到 26 甚至更高,这很棒。
如果我开始对图像数据应用一些 CIFilters,FPS 会降至 10 甚至更低。直播视频会开始看起来很糟糕。
我了解 Instagram 和 Path 将直接使用 OpenGL ES,而不是使用 CoreImage 等封装框架,以便他们可以为 GPU 渲染构建更高效的代码。同时,我也注意到 Instagram 实际上降低了示例视频质量以进一步减轻 GPU 负担。下面是我的应用程序(左)和 Instagram(右)都在捕获实时视频时拍摄的屏幕截图。注意两张图片中的字母Z和S。你可以看到Instagram的视频质量比我的略差。
所以现在我正在考虑各种降低实时视频帧质量的方法。但我真的不知道哪种方式更好。以及我应该如何实现它。
-
在将其转换为 CIImage 对象之前,请尝试降低此 (CMSampleBufferRef)sampleBuffer 的质量。
尝试从 CIImage 或 CIFilter 或 CIContext 中寻找一些 API 来降低视频帧质量。
尝试从 OpenGL ES 中寻找一些 API 来降低视频帧质量。
再说一次,我现在没有任何线索。因此,任何建议将不胜感激!
【问题讨论】:
【参考方案1】:AVcaptureSession
具有sessionPreset
属性,可以将视频质量设置为低、中或高。
以下代码将质量设置为中等。
[self.mSession setSessionPreset:AVCaptureSessionPresetMedium];
【讨论】:
正如我所提到的,我最终需要使用这个会话来拍摄高质量的照片。此外,动态切换预设的时间损失是巨大的。因此,AVCaptureSessionPresetPhoto 以外的预设是不可能的。【参考方案2】:如果您不愿意降低视频质量(而且我认为 AVCaptureSessionPresetPhoto 无论如何都相当低),您最好的选择是优化您的过滤器或降低帧速率。
您可能会想,好吧,我已经获得了较低的帧速率。但是,提前设置会优化丢帧的方式。因此,如果您现在获得 10 fps,请尝试将最大帧速率设置为 15,您可能会获得 15。15 fps 非常适合预览。
(我曾在 Flare 上工作过,这是目前最苛刻的应用之一 itun.es/iLQ3bR。)
【讨论】:
以上是关于使用 CIImage 进行实时过滤时降低视频质量以获得更高的 FPS的主要内容,如果未能解决你的问题,请参考以下文章