是否有可能使用video作为纹理GL在iOS?

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

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

从iOS 4.0开始,您可以使用AVCaptureDeviceInput获取摄像机作为设备input,并将其连接到AVCaptureVideoDataOutput ,并将其设置为AVCaptureVideoDataOutput 。 通过为摄像机设置一个32bpp的BGRA格式,委托对象将以完美的格式接收来自摄像机的每一帧,并立即交给glTexImage2D (如果设备不支持非幂次方纹理, glTexSubImage2D ; I认为MBX设备属于这一类)。

有一堆的帧大小和帧速率选项; 在猜测你必须调整这取决于你想要使用GPU的多less。 我发现一个完全无关紧要的场景,只是一个纹理四合一显示最新的帧,只有当一个新的帧到达iPhone 4时才重新绘制,能够显示该设备的最大720p 24fps的饲料,没有任何明显的滞后。 我没有进行比这更彻底的基准testing,所以希望别人能提供build议。

原则上,根据API,帧可以在扫描线之间返回一些内存中的填充,这意味着在发布到GL之前需要对内容进行一些混洗,因此您需要为此实现代码path。 实际上,从纯粹的经验来看,iOS的当前版本似乎不会以这种forms返回图像,所以它不是真正的性能问题。

编辑:现在是非常接近三年后。 在过渡期间,苹果已经发布了iOS 5,6和7.其中5人推出了CVOpenGLESTextureCVOpenGLESTextureCache ,这是将video从捕捉设备传送到OpenGL的智能方式。 苹果在这里提供了示例代码,从RippleViewController.m特别感兴趣的部分,具体来说是它的setupAVCapturecaptureOutput:didOutputSampleBuffer:fromConnection: – 见行196-329。 令人遗憾的是,条款和条件在不附加整个项目的情况下防止了代码的重复,但是一步一步的设置是:

  1. 创build一个CVOpenGLESTextureCacheCreate和一个AVCaptureSession ;
  2. 抓一个合适的videoAVCaptureDevice ;
  3. 用该捕获设备创build一个AVCaptureDeviceInput ;
  4. 附加一个AVCaptureVideoDataOutput并告诉它作为一个样本缓冲区AVCaptureVideoDataOutput来调用你。

在收到每个样本缓冲区后:

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

使用RosyWriter提供了一个更好的OpenGLvideo渲染示例。 性能非常好,特别是如果你降低帧速率(1080P / 30时约为10%,1080P / 15时大于5%)。