我正在尝试像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的视频质量略低于我的。
所以现在我正在考虑各种降低实时视频帧质量的方法。但我真的不知道哪条路更好。我应该如何实现它。
同样,我现在没有任何线索。所以任何建议都将不胜感激!
答案 0 :(得分:0)
AVcaptureSession
具有sessionPreset
属性,可以将视频质量设置为低或中等。
以下代码将质量设置为中等。
[self.mSession setSessionPreset:AVCaptureSessionPresetMedium];
答案 1 :(得分:0)
如果您不愿意降低视频质量(我认为AVCaptureSessionPresetPhoto相当低),您最好的选择是优化滤镜或降低帧速率。
您可能会认为,我已经获得了较低的帧速率。但是,提前设置将优化帧的丢弃方式。因此,如果您现在获得10fps,请尝试将最大帧速率设置为15,然后您可能只需要15. 15fps非常适合预览。
(我已经在Flare上工作了一个最苛刻的应用程序itun.es/iLQ3bR。)