是否可以使用视频(预渲染,使用H.264压缩)作为iOS中GL的纹理?
如果可能的话,怎么做呢?是否有播放质量/帧率或限制?
发布于 2010-11-22 10:00:39
从iOS 4.0开始,您可以使用AVCaptureDeviceInput将摄影机作为设备输入,并将其连接到将任何您喜欢的对象设置为代理的AVCaptureVideoDataOutput。通过为相机设置32bpp的BGRA格式,代理对象将从相机接收到的每一帧帧的格式都非常适合立即传递给glTexImage2D (如果设备不支持非2次方纹理,则为glTexSubImage2D;我认为MBX设备就属于这一类)。
有一堆帧大小和帧速率选项;在猜测中,你必须根据你想要使用GPU的多少来调整它们。我发现,一个完全平凡的场景,只有一个纹理四边形显示了最新的帧,只有当新帧到达iPhone 4时才重新绘制,能够显示该设备的最大720p 24fps视频,而没有任何明显的延迟。我还没有做过比这更彻底的基准测试,所以希望其他人能给我一些建议。
原则上,根据API,帧可以在扫描行之间返回一些内存填充,这意味着在发布到GL之前需要对内容进行一些混洗,因此您确实需要为此实现代码路径。在实践中,纯粹从经验上讲,当前版本的iOS似乎从未以这种形式返回图像,因此这并不是一个真正的性能问题。
编辑:现在已经非常接近三年后了。在此期间,苹果发布了iOS 5、6和7。他们在5中推出了CVOpenGLESTexture和CVOpenGLESTextureCache,它们现在是将视频从采集设备传输到OpenGL的智能方式。苹果提供了示例代码here,其中特别有趣的部分在RippleViewController.m中,特别是它的setupAVCapture和captureOutput:didOutputSampleBuffer:fromConnection: -参见第196-329行。遗憾的是,条款和条件避免了此处的代码复制,而不是附加整个项目,但逐步设置是:
使用video;
CVOpenGLESTextureCacheCreate和AVCaptureSession;AVCaptureDeviceInput AVCaptureVideoDataOutput,并告诉它调用您作为示例缓冲区委托。在接收到每个采样缓冲器时:
CVImageBufferRef;CVOpenGLESTextureCacheCreateTextureFromImage从CV图像缓冲区中获取Y和UV纹理;发布于 2015-04-07 01:24:01
有关如何进行OpenGL视频渲染的更好示例,请使用RosyWriter。性能非常好,特别是如果您降低帧率(在1080P/30时约为10%,在1080P/15时为>=5% )。
https://stackoverflow.com/questions/4237538
复制相似问题