是否可以在iOS中使用视频(预渲染,使用H.264压缩)作为GL的纹理?
如果可能,该怎么做?以及任何播放质量/帧速率或限制?
答案 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.他们引入了CVOpenGLESTexture
和CVOpenGLESTextureCache
,现在是将视频从捕获设备传输到OpenGL的智能方法。 Apple提供示例代码here,其中特别有趣的部分位于RippleViewController.m
,特别是其setupAVCapture
和captureOutput:didOutputSampleBuffer:fromConnection:
- 请参阅第196-329行。遗憾的是,这些条款和条件可以防止代码重复,而无需附加整个项目,但逐步设置是:
CVOpenGLESTextureCacheCreate
和AVCaptureSession
; AVCaptureDevice
; AVCaptureDeviceInput
; AVCaptureVideoDataOutput
并告诉它将您称为样本缓冲区委托。收到每个样本缓冲区后:
CVImageBufferRef
; CVOpenGLESTextureCacheCreateTextureFromImage
从CV图像缓冲区获取Y和UV CVOpenGLESTextureRef
; 答案 1 :(得分:0)
使用RosyWriter获取更多关于如何进行OpenGL视频渲染的示例。性能非常好,特别是如果你降低帧率(在1080P / 30时为~10%,在1080P / 15时为> 5%。