我正在开发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上应用模糊。
如何从相机预览图层中获取模糊图像?
答案 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。如果您尝试从该视图制作图像,则不会看到任何内容。
我所知道的唯一解决方案是AVCaptureVideoDataOutput
和AVCaptureStillImageOutput
。每个人都有自己的限制。第一个不能与AVCaptureMovieFileOutput
采集同时工作,后者会产生快门噪声。