获取视频流需要AV Foundation:AVCaptureVideoDataOutputSampleBufferDelegate
来获取图像缓冲区,然后使用像UIImage
这样的Quartz函数构建CGBitmapContextCreate
。这在http://www.benjaminloulier.com/articles/ios4-and-direct-access-to-the-camera或Apple AV Foundation Programming Guide(参见https://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html#//apple_ref/doc/uid/TP40010188-CH5-SW30)
然后我可以为我的“静止”图像创建一个纹理,并将其与GLKBaseEffect
(或着色器?)一起使用。
问题1:GLKBaseEffect
看起来非常简单,但我应该针对OpenGL 2和着色器吗?
现在Apple的RosyWriter演示使用Core Video CVOpenGLESTextureCacheCreateTextureFromImage
函数直接绑定纹理,而不创建中间UIImage
。这是 - 如演示说明中所述 - IOS 5中的新内容。
问题2:这是映射纹理的更好方法吗?
问题3:有一些有趣的框架,如GPUImage,甚至可以使用的3D游戏框架。有没有人对使用这些有什么反馈?到目前为止,苹果提供的框架对我来说似乎相当完整。
非常感谢!
答案 0 :(得分:3)
回答您的各种问题:
GLKBaseEffect似乎非常简单,但我应该瞄准 OpenGL 2和着色器?
GLKBaseEffect只是一些简单的OpenGL ES 2.0着色器的包装器,所以它的核心是2.0。虽然GLKit提供了一些不错的便利,但最终你需要创建默认情况下无法提供的效果,所以你很可能需要学习如何在某些时候做自己的顶点和片段着色器。我列出了一些用于在this answer中学习这些资源的资源。
现在Apple的RosyWriter演示使用Core Video CVOpenGLESTextureCacheCreateTextureFromImage函数直接绑定 纹理没有创建中间UIImage。这是 - 作为 在演示说明中说明 - IOS 5中的新内容。
问题2:这是映射纹理的更好方法吗?
是的,在iOS 5.0上,使用纹理缓存上传视频帧可以带来一些可靠的性能提升。对于iPhone 4S,我看到使用纹理缓存时,帧上传时间从640毫秒到640毫秒到1.8毫秒。 reading from the texture caches to encode video时可以获得更大的好处。
问题3:有一些有趣的框架,如GPUImage,或 甚至可以使用的3D游戏框架。有没有人 使用这些的反馈?苹果提供的框架似乎相当 到目前为止我已经完成了。
我建议使用GPUImage,但我有点偏颇,看我是怎么写的。作为一个更具体的观点,我几乎完全按照您在框架的示例代码中的CubeExample中描述的内容(读取视频帧并将它们映射到旋转立方体的两侧)。
这个例子有点复杂,因为我拍摄现场视频,通过棕褐色调过滤器,将其作为纹理读取并将其显示在可以用手指旋转的三维立方体上,然后通过像素化过滤器获取多维数据集的渲染视图。但是,您可以从此示例中仅提取所需的部分。通过这样做,您将节省大量代码,因为我负责视频捕获并上传到OpenGL ES。