在iOS中可以使用视频作为GL的纹理吗?

使用视频(预渲染,H.264压缩)可以在iOS中使用GL的纹理吗?

如有可能,怎么办?和播放质量/帧速率还是局限性?

解决方法

从iOS 4.0开始,您可以使用AVCaptureDeviceInput将相机作为设备输入,并将其连接到AVCaptureVideoDataOutput,并将任何您喜欢设置的对象设置为代理.通过为相机设置一个32bpp BGRA格式,委托对象将以一种格式接收相机中的每个帧,只需将其立即处理为glTex Image2D(如果设备不支持非二次纹理,则为glTexSubImage2D; I认为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行.令人遗憾的是,条款和条件阻止了这里的代码重复,而不附加整个项目,但分步安装是:

>创建一个CVOpenGLESTextureCacheCreate和一个AVCaptureSession;
抓住适合的视频AVCaptureDevice;
>使用该捕获设备创建一个AVCaptureDeviceInput;
>附加一个AVCaptureVideoDataOutput,并告诉它作为示例缓冲区委托来呼叫你.

收到每个样品缓冲液后:

从它获取CVImageBufferRef;>使用CVOpenGLESTextureCacheCreateTextureFromImage从CV图像缓冲区中获取Y和UV CVOpenGLESTextureRefs;从CV OpenGLES纹理引用获取纹理目标和名称,以便绑定它们;>在着色器中组合亮度和色度.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...