从捕获的视频帧创建openGL纹理以覆盖视频上的openGL视图的替代方法? (苹果手机)

时间:2010-12-17 19:01:07

标签: iphone opengl-es avcapturesession

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

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

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

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

2 个答案:

答案 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上的所有其他透明内容一样被预乘)。