从捕获的视频帧创建openGL纹理以在视频上覆盖openGL视图的替代方案?(iPhone)

从捕获的视频帧创建openGL纹理以在视频上覆盖openGL视图的替代方案?(iPhone),iphone,opengl-es,avcapturesession,Iphone,Opengl Es,Avcapturesession,这主要与增强现实类型的应用程序相关。Apple在此处提供了有关如何使用AVCaptureSession捕获视频帧(并在需要时将其保存为图像)的信息: 我知道有可能在捕获的视频帧中创建一个openGL纹理,然后在openGL视图中将其用作背景,覆盖其他图形 我想知道这种方法是否有其他选择?上面提到的方法可能是最好的(我不知道是否是),但如果有其他方法可以尝试,最好知道。例如,是否有一种方法可以将openGL视图直接覆盖在AVCaptureVideoPreviewLayer上?当然,视图可以分层在

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

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


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

当然,视图可以分层在一起,而不考虑内容。在视频上分层GL与在2D上分层2D无异


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

您确实可以在AVCaptureVideoPreviewLayer之类的内容上分层OpenGL内容,但您的性能将受到影响。苹果强烈建议不要将非不透明的OpenGL ES内容覆盖在其他显示元素之上。从:

为了获得绝对最佳的性能, 您的申请应完全依赖于 OpenGL支持渲染您的内容。到 执行此操作时,请调整容纳您的视图的大小 CaeAglayer对象以匹配 屏幕,将其不透明属性设置为 是的,并确保没有其他核心 动画层或视图可见。 如果您的OpenGL ES层是合成的 在其他层之上,使您的 CaeAglayer对象不透明,但 并没有消除性能 成本

如果您的CaeAglayer对象已混合 在它下面的层的顶部 层层次结构,渲染缓冲区的 颜色数据必须是预乘的 要合成的alpha格式 正确的核心动画。混合 OpenGL将内容放在其他内容之上 内容具有严重的性能 惩罚

老实说,把视频作为一种纹理拉进去,然后在你的3D覆盖物后面作为一个广告牌来显示,其实并不难。我的示例应用程序将摄像头视频传递到OpenGL ES(2.0)纹理,以显示在屏幕上。只需稍加修改,就可以将3D内容放在上面。这将为您提供比尝试在AVCaptureVideoPreviewLayer上绘制非不透明的3D内容更好的性能


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

谢谢。我在将视频作为纹理拉入时没有问题,但我不确定哪种技术会产生最佳性能(创建/绑定纹理vs分层)。你的苹果文档链接和你自己的代码非常有用。我正在做一些与您的代码非常相似的事情,并且大部分都已准备就绪。谢谢。@BradLarson如果我们将AVCaptureVideoPreviewLayer放在OpenGL ES内容的顶部,会不会出现性能问题?@entropy-如果你说的是一个不透明的OpenGL ES宿主视图,这与将其他UIView放在它前面没有什么显著区别。当然,您必须首先分析这一点,以了解真正的影响是什么,因为额外的合成工作负载可能会减慢速度。不过,最好将相机视频输入OpenGL ES纹理并在场景中显示。例如,我的GPUImage框架可以做到这一点,但从AVFoundation到纹理的代码编写非常简单。谢谢。我一开始就没有考虑把一切都预先考虑进去。