这主要与增强现实类型应用相关。 Apple提供了有关如何使用AVCaptureSession捕获视频帧(并在需要时将其另存为图像)的信息:
http://developer.apple.com/library/ios/#qa/qa2010/qa1702.html
我知道可以在捕获的视频帧中创建一个openGL纹理,然后将其用作openGL视图中的背景,覆盖其他图形。
我想知道这种方法是否有其他选择?上面提到的方法可能是最好的(我不知道是不是),但是如果有其他方法可以尝试,那将是很好的。例如,有没有办法直接在AVCaptureVideoPreviewLayer上覆盖openGL视图?
答案 0 :(得分:6)
您确实可以将AVGL内容叠加在AVCaptureVideoPreviewLayer之类的内容上,但您的性能会受到影响。 Apple强烈建议您不要将非不透明的OpenGL ES内容叠加在其他显示元素之上。来自OpenGL ES Programming Guide for iOS:
为了绝对最佳的表现, 您的申请应完全依赖 OpenGL ES用于呈现您的内容。至 这样做,调整持有你的视图的大小 CAEAGLLayer对象匹配 屏幕,将其不透明属性设置为 是的,并确保没有其他核心 动画图层或视图是可见的。 如果您的OpenGL ES图层是合成的 在其他层之上,制作你的 CAEAGLLayer对象不透明减少但是 不会消除性能 成本。
如果您的CAEAGLLayer对象已混合 在它下面的层之上 图层层次结构,渲染缓冲区 颜色数据必须是预乘的 要合成的alpha格式 正确的核心动画。混纺 OpenGL ES内容基于其他 内容有严重的表现 罚。
老实说,将视频作为纹理拉入并将其显示为3-D叠加层背后的广告牌并不难。我的示例应用程序here将相机视频传送到OpenGL ES(2.0)纹理以显示在屏幕上。只需进行一些修改,您就可以在其上放置3-D内容。这将比尝试在AVCaptureVideoPreviewLayer上绘制非不透明的3-D内容提供更好的性能。
但是,如果您只是希望在OpenGL ES内容上显示简单的静态UIViews,那么可以在没有太多性能损失的情况下完成(根据我的经验,帧速率降低约5%)。
答案 1 :(得分:1)
当然,无论内容如何,视图都可以分层。在视频上分层GL与在2D上分层2D没什么不同。
几乎唯一的问题是你需要渲染你的GL内容,以便生成的图像被alpha预乘(就像iOS上的所有其他透明内容一样被预乘)。