2

我正在开发一个 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 上应用模糊。

如何从相机预览层获得模糊的图像?

4

2 回答 2

1

从这个技术问答中引用苹果:

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

根据我关于 AVFoundation 的经验,如果您在托管预览层的视图上使用该方法,您将只能获得视图的内容而没有预览层的图像。使用 -snapshotViewAfterScreenUpdates:将返回一个承载特殊层的 UIView。如果您尝试从该视图制作图像,您将什么也看不到。
我知道的唯一解决方案是AVCaptureVideoDataOutputand AVCaptureStillImageOutput。每个人都有自己的限制。第一个不能与AVCaptureMovieFileOutput采集同时工作,后者会产生快门噪音。

于 2014-03-06T09:16:22.343 回答
1

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

这应该提供更好的性能。和苹果一样好吗?好吧,他们正在使用一些开发人员还无法访问的私人东西......

于 2013-09-30T02:31:19.627 回答