是否有可能使用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人推出了CVOpenGLESTexture
和CVOpenGLESTextureCache
,这是将video从捕捉设备传送到OpenGL的智能方式。 苹果在这里提供了示例代码,从RippleViewController.m
特别感兴趣的部分,具体来说是它的setupAVCapture
和captureOutput:didOutputSampleBuffer:fromConnection:
– 见行196-329。 令人遗憾的是,条款和条件在不附加整个项目的情况下防止了代码的重复,但是一步一步的设置是:
- 创build一个
CVOpenGLESTextureCacheCreate
和一个AVCaptureSession
; - 抓一个合适的video
AVCaptureDevice
; - 用该捕获设备创build一个
AVCaptureDeviceInput
; - 附加一个
AVCaptureVideoDataOutput
并告诉它作为一个样本缓冲区AVCaptureVideoDataOutput
来调用你。
在收到每个样本缓冲区后:
- 从中获取
CVImageBufferRef
; - 使用
CVOpenGLESTextureCacheCreateTextureFromImage
从CV图像缓冲区中获取Y和UVCVOpenGLESTextureRef
; - 从CV OpenGLES纹理引用中获取纹理目标和名称以绑定它们;
- 在着色器中结合亮度和色度。
使用RosyWriter提供了一个更好的OpenGLvideo渲染示例。 性能非常好,特别是如果你降低帧速率(1080P / 30时约为10%,1080P / 15时大于5%)。