使用 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(右)都在捕获实时视频时拍摄的屏幕截图。注意两张图片中的字母ZS。你可以看到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的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Filmage Screen降低视频文件大小?

c#:以 100% 质量保存 JPEG 时降低图像质量

svg下图像标签中的过滤器会降低图像质量吗?

在特定时间准确剪切视频而不会降低质量

专场福利Part2从多维度出发 保障&提升实时音视频质量

在特定时间准确剪切视频而不会降低质量