【问题标题】:Is it possible using video as texture for GL in iOS?是否可以在 iOS 中使用视频作为 GL 的纹理?
【发布时间】:2011-05-13 08:37:32
【问题描述】:

是否可以在 iOS 中使用视频(预渲染,使用 H.264 压缩)作为 GL 的纹理?

如果可能,怎么做?以及任何播放质量/帧速率或限制?

【问题讨论】:

    标签: video ios opengl-es textures


    【解决方案1】:

    从 iOS 4.0 开始,您可以使用 AVCaptureDeviceInput 将相机作为设备输入,并将其连接到 AVCaptureVideoDataOutput,并将您喜欢的任何对象设置为委托。通过为相机设置 32bpp BGRA 格式,委托对象将从相机接收每一帧,格式非常适合立即交给glTexImage2D(或glTexSubImage2D,如果设备不支持非power-of-两种纹理;我认为 MBX 设备属于这一类)。

    有很多帧大小和帧速率选项;猜测你将不得不根据你想要使用 GPU 的其他多少来调整这些。我发现一个完全微不足道的场景,只有一个带纹理的四边形显示最新帧,仅当新帧到达 iPhone 4 时才重新绘制,能够显示该设备的最大 720p 24fps 馈送而没有任何明显的延迟。我还没有进行过比这更彻底的基准测试,所以希望其他人可以提供建议。

    原则上,根据 API,帧可以在扫描线之间带有一些内存填充,这意味着在发送到 GL 之前会进行一些内容混洗,因此您确实需要为此实现代码路径。在实践中,纯粹凭经验说,当前版本的 iOS 似乎从不以这种形式返回图像,因此这并不是真正的性能问题。

    编辑:现在非常接近三年后。在此期间,Apple 发布了 iOS 5、6 和 7。在 5 中,他们引入了 CVOpenGLESTextureCVOpenGLESTextureCache,它们现在是将视频从捕获设备传输到 OpenGL 的智能方式。 Apple 提供了示例代码here,其中特别有趣的部分在RippleViewController.m,特别是它的setupAVCapturecaptureOutput:didOutputSampleBuffer:fromConnection:——见第196-329 行。遗憾的是,条款和条件防止在不附加整个项目的情况下复制此处的代码,但分步设置是:

    1. 创建一个CVOpenGLESTextureCacheCreate 和一个AVCaptureSession
    2. 为视频找一个合适的AVCaptureDevice
    3. 使用该捕获设备创建一个AVCaptureDeviceInput
    4. 附加一个AVCaptureVideoDataOutput 并告诉它调用您作为样本缓冲区代理。

    收到每个样本缓冲区后:

    1. 从中获取CVImageBufferRef
    2. 使用CVOpenGLESTextureCacheCreateTextureFromImage 从CV 图像缓冲区中获取Y 和UV CVOpenGLESTextureRefs;
    3. 从 CV OpenGLES 纹理引用中获取纹理目标和名称以绑定它们;
    4. 在着色器中结合亮度和色度。

    【讨论】:

    • 感谢您的回答。我会挖的。
    • 只需大约 200 行就可以将整个事情联系在一起;抱歉没有发布代码 - 我只在工作时解决了这个问题,所以合同禁止发布我所拥有的。但这确实是微不足道的事情,而且我确实花了很多时间来确定文档中哪些是合适的类,而不是编码。
    • 我关于在 OpenGL 中使用 32BPP 图像作为纹理的博文,包括 xcode 项目和源代码:modejong.com/blog/…
    • @Tommy 现在关于这个主题的所有答案都是“这很容易。我不会告诉你怎么做。很简单。只需深入研究 API。是的”。感谢您快速写了一些东西,但那是 3 年前的事了,现在 SO 的所有答案都是关于这个主题的糟糕答案。
    • @Adam 自 iOS 5 以来(大约在我最初回答后一年)Apple 提供了将 CVImageBuffers 通勤到 OpenGL 的内置功能,并提供了一个示例项目;我添加了一个链接以及所涉及步骤的更详细的细分。
    【解决方案2】:

    使用RosyWriter 获得更好的示例来说明如何进行 OpenGL 视频渲染。性能非常好,尤其是如果您降低帧速率(在 1080P/30 时约为 10%,在 1080P/15 时 >=5%。

    【讨论】:

      猜你喜欢
      • 2011-09-28
      • 1970-01-01
      • 2014-05-31
      • 2011-01-27
      • 2011-10-15
      • 1970-01-01
      • 2013-04-28
      • 2016-10-19
      • 1970-01-01
      相关资源
      最近更新 更多