在iOS中使用视频作为GL的纹理是否可行?

时间:2010-11-21 11:12:14

标签: video ios opengl-es textures

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

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

2 个答案:

答案 0 :(得分:19)

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

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

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

编辑:现在非常接近三年了。在过渡期间,Apple发布了iOS 5,6和7.他们引入了CVOpenGLESTextureCVOpenGLESTextureCache,现在是将视频从捕获设备传输到OpenGL的智能方法。 Apple提供示例代码here,其中特别有趣的部分位于RippleViewController.m,特别是其setupAVCapturecaptureOutput:didOutputSampleBuffer:fromConnection: - 请参阅第196-329行。遗憾的是,这些条款和条件可以防止代码重复,而无需附加整个项目,但逐步设置是:

  1. 创建CVOpenGLESTextureCacheCreateAVCaptureSession;
  2. 为视频抓取合适的AVCaptureDevice;
  3. 使用该捕获设备创建AVCaptureDeviceInput;
  4. 附加AVCaptureVideoDataOutput并告诉它将您称为样本缓冲区委托。
  5. 收到每个样本缓冲区后:

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

答案 1 :(得分:0)

使用RosyWriter获取更多关于如何进行OpenGL视频渲染的示例。性能非常好,特别是如果你降低帧率(在1080P / 30时为~10%,在1080P / 15时为> 5%。