【发布时间】:2011-05-13 08:37:32
【问题描述】:
是否可以在 iOS 中使用视频(预渲染,使用 H.264 压缩)作为 GL 的纹理?
如果可能,怎么做?以及任何播放质量/帧速率或限制?
【问题讨论】:
标签: video ios opengl-es textures
是否可以在 iOS 中使用视频(预渲染,使用 H.264 压缩)作为 GL 的纹理?
如果可能,怎么做?以及任何播放质量/帧速率或限制?
【问题讨论】:
标签: video ios opengl-es textures
从 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 中,他们引入了 CVOpenGLESTexture 和 CVOpenGLESTextureCache,它们现在是将视频从捕获设备传输到 OpenGL 的智能方式。 Apple 提供了示例代码here,其中特别有趣的部分在RippleViewController.m,特别是它的setupAVCapture 和captureOutput:didOutputSampleBuffer:fromConnection:——见第196-329 行。遗憾的是,条款和条件防止在不附加整个项目的情况下复制此处的代码,但分步设置是:
CVOpenGLESTextureCacheCreate 和一个AVCaptureSession;AVCaptureDevice;AVCaptureDeviceInput;AVCaptureVideoDataOutput 并告诉它调用您作为样本缓冲区代理。收到每个样本缓冲区后:
CVImageBufferRef;CVOpenGLESTextureCacheCreateTextureFromImage 从CV 图像缓冲区中获取Y 和UV CVOpenGLESTextureRefs;【讨论】:
CVImageBuffers 通勤到 OpenGL 的内置功能,并提供了一个示例项目;我添加了一个链接以及所涉及步骤的更详细的细分。
使用RosyWriter 获得更好的示例来说明如何进行 OpenGL 视频渲染。性能非常好,尤其是如果您降低帧速率(在 1080P/30 时约为 10%,在 1080P/15 时 >=5%。
【讨论】: