来自iOS7中AVCaptureVideoPreviewLayer的模糊图像

时间:2013-09-04 17:28:06

标签: objective-c uikit avfoundation ios7

我正在开发iOS7视频录制应用程序。我们的应用程序中的相机屏幕需要显示类似于iOS7控制中心中显示的模糊背景。在显示视频预览时,我们需要显示模糊的控制中心。 正如WWDC视频226中所建议的那样,我使用下面提供的代码来获取相机预览快照,然后应用模糊并将此模糊图像设置到我的视图中。

UIGraphicsBeginImageContextWithOptions(_camerapreview.frame.size, NULL, 0);

[_camerapreview drawViewHierarchyInRect:rect];

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

lightImage = [newImage applyLightEffect]

这里_camerapreview是一个包含AVCaptureVideoPreviewLayer的UIView。从上下文中获取的* newImage由于某种原因是黑色的。

但是,如果我使用[_camerapreview snapshotView]返回带有预览层内容的UIview。但是没有办法在UIview上应用模糊。

如何从相机预览图层中获取模糊图像?

2 个答案:

答案 0 :(得分:1)

我建议您将叠加层放在视频预览本身作为合成视频图层,并为其添加模糊滤镜。 (检查WWDC AVFoundation会话和用于将图像合成到视频上的AVSimpleEditoriOS示例代码)这样​​你就可以停留在GPU而不是从GPU-> CPU进行回读,这很慢。然后在明确的背景UIView中将叠加层的UI元素放在视频预览的顶部。

这应该提供更好的表现。和Apple一样好吗?好吧,他们正在使用开发人员尚无法访问的一些私人资料......

答案 1 :(得分:1)

从此Technical Q&A引用Apple:

  

答:从iOS 7开始,UIView类提供了一种方法   -drawViewHierarchyInRect:afterScreenUpdates :,它允许您将整个视图层次结构的快照呈现为屏幕上可见的   位图上下文。在iOS 6及更早版本中,如何捕获视图的绘图   内容取决于底层绘图技术。这种新方法   -drawViewHierarchyInRect:afterScreenUpdates:使您能够将接收器视图及其子视图的内容捕获到图像   无论绘图技术如何(例如UIKit,Quartz,   OpenGL ES,SpriteKit,AV Foundation等),其中包含视图   呈现

根据我对AVFoundation的体验并非如此,如果您在托管预览图层的视图上使用该方法,则只能获取视图内容而不显示预览图层的图像。使用-snapshotViewAfterScreenUpdates:将返回托管特殊图层的UIView。如果您尝试从该视图制作图像,则不会看到任何内容。
我所知道的唯一解决方案是AVCaptureVideoDataOutputAVCaptureStillImageOutput。每个人都有自己的限制。第一个不能与AVCaptureMovieFileOutput采集同时工作,后者会产生快门噪声。