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

StackOverflow https://stackoverflow.com/questions/4473894

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

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

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

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

有帮助吗?

解决方案

您确实可以在诸如avCaptureVideOpreviewlayer之类的内容上层面张开openGL内容,但是您的性能会受到影响。 Apple强烈建议您不要在其他显示元素上叠加非opaque OpenGL ES内容。来自 iOS的OpenGL ES编程指南:

为了获得绝对的最佳性能,您的应用程序应仅依靠OpenGL ES来渲染您的内容。为此,大小的视图将您的CaeGllayer对象保持匹配,以匹配屏幕,将其不透明的属性设置为“是”,并确保看不到其他核心动画层或视图。如果您的OpenGL ES层合成在其他层的顶部,则使您的Caegllayer对象不透明降低,但不会消除性能成本。

如果您的caegllayer对象在层层次结构下方的层顶部混合在其下面的层上,则RenderBuffer的颜色数据必须采用超级alpha格式,才能通过核心动画正确地合成。将OpenGL ES内容混合在其他内容之上的性能罚款严重。

老实说,将视频作为纹理的拉动并不难,然后将其显示为3D覆盖层后面的广告牌。我的示例申请 这里 可以将相机视频传递到OpenGL ES(2.0)纹理以显示到屏幕上的纹理。只需进行一些修改,您就可以将3-D内容放在其中。这将为您提供比尝试在AvCaptureVideOpreviewlayer之上绘制非Opaque 3-D内容更好的性能。

但是,如果您只想在OpenGL ES内容上显示简单的静态Uiviews,则可以在没有大部分惩罚的情况下完成(根据我的经验,帧率降低约5%)。

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top