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

Ski*_* M2 5 iphone opengl-es avcapturesession

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

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

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

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

Bra*_*son 6

您确实可以通过AVCaptureVideoPreviewLayer等方式对OpenGL内容进行分层,但您的性能会受到影响.Apple强烈建议您不要将非不透明的OpenGL ES内容叠加在其他显示元素之上.从适用于iOSOpenGL ES编程指南:

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

如果您的CAEAGLLayer对象在图层层次结构中混合在其下面的图层之上,则渲染缓冲区的颜色数据必须采用预乘Alpha格式才能由Core Animation正确合成.将OpenGL ES内容混合到其他内容之上会严重影响性能.

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

但是,如果你只是想显示在OpenGL ES的内容简单的静态UIViews,可没有多少性能上的损失(〜在帧率减少5%,以我的经验)来完成.