5

这主要与增强现实类型的应用程序相关。Apple 在此处提供了有关如何使用 AVCaptureSession 捕获视频帧(并在需要时将它们保存为图像)的信息:

http://developer.apple.com/library/ios/#qa/qa2010/qa1702.html

我知道可以从捕获的视频帧中创建一个 openGL 纹理,然后将其用作 openGL 视图中的背景,以覆盖其他图形。

我想知道这种方法是否有任何替代方法?上面提到的方法可能是最好的(我不知道是不是),但如果有其他方法可以尝试,最好知道。例如,有没有办法将 openGL 视图直接覆盖在 AVCaptureVideoPreviewLayer 上?

4

2 回答 2

6

您确实可以在 AVCaptureVideoPreviewLayer 之类的东西上分层 OpenGL 内容,但您的性能会受到影响。Apple 强烈建议您不要将不透明的 OpenGL ES 内容覆盖在其他显示元素之上。来自OpenGL ES Programming Guide for iOS

为了获得绝对的最佳性能,您的应用程序应该完全依赖 OpenGL ES 来呈现您的内容。为此,请调整包含 CAEAGLLayer 对象的视图以匹配屏幕,将其 opaque 属性设置为 YES,并确保没有其他核心动画层或视图可见。如果您的 OpenGL ES 层是在其他层之上合成的,则使您的 CAEAGLLayer 对象不透明会降低但不会消除性能成本。

如果您的 CAEAGLLayer 对象在层层次结构中混合在其下方的层之上,则渲染缓冲区的颜色数据必须采用预乘 alpha 格式,才能由 Core Animation 正确合成。在其他内容之上混合 OpenGL ES 内容会导致严重的性能损失。

老实说,将视频作为纹理拉入,然后将其显示为 3-D 叠加层后面的广告牌并不难。我的示例应用程序将相机视频传递到 OpenGL ES (2.0) 纹理以显示到屏幕上。只需进行一些修改,您就可以在其上放置 3-D 内容。与尝试在 AVCaptureVideoPreviewLayer 之上绘制非透明 3-D 内容相比,这将为您提供更好的性能。

但是,如果您只想在 OpenGL ES 内容上显示简单的静态 UIView,则可以在没有太多性能损失的情况下完成(根据我的经验,帧率降低了约 5%)。

于 2010-12-17T23:01:46.017 回答
1

当然,无论内容如何,​​视图都可以分层。在视频上分层 GL 与在 2D 上分层 2D 没有什么不同。

唯一的问题是您需要渲染 GL 内容,以便生成的图像预乘 alpha(就像 iOS 上的所有其他透明内容都预乘一样)。

于 2010-12-17T20:42:31.157 回答