Iphone OpenGL ES:将一系列纹理存储为电影文件
我一直在从iPhone摄像头抓取实时视频帧,并将其作为纹理应用于平面OpenGL几何体,以便使用着色器处理摄像头输入。有人知道是否有可能抓取处理过的纹理并将其存储在电影文件中吗 这似乎需要很大的处理能力,我不确定最好的方法是什么——或者是否可能。这里的动机是能够对从相机抓取的视频执行有趣的着色器效果,然后存储结果以与其他人共享Iphone OpenGL ES:将一系列纹理存储为电影文件,iphone,objective-c,opengl-es,textures,movie,Iphone,Objective C,Opengl Es,Textures,Movie,我一直在从iPhone摄像头抓取实时视频帧,并将其作为纹理应用于平面OpenGL几何体,以便使用着色器处理摄像头输入。有人知道是否有可能抓取处理过的纹理并将其存储在电影文件中吗 这似乎需要很大的处理能力,我不确定最好的方法是什么——或者是否可能。这里的动机是能够对从相机抓取的视频执行有趣的着色器效果,然后存储结果以与其他人共享 提前感谢您的想法。我无法评论性能,但您想做的是: 创建一个AVAssetWriter(它可以获取传入的样本并将其写入H.264;当前iOS版本似乎不支持其他文件格式)
提前感谢您的想法。我无法评论性能,但您想做的是:
- 创建一个
(它可以获取传入的样本并将其写入H.264;当前iOS版本似乎不支持其他文件格式)AVAssetWriter
- 将
附加到资产写入器以提供视频帧(资产写入器接收一个或多个输入,每个输入提供资产的不同方面)李>AVAssetWriterInput
- 将
附加到asset writer输入,以便可以在输入端推送像素缓冲区。您需要告诉asset writer输入它需要实时的媒体数据。这样做只会告诉它要时刻准备好输入。您可以在提供帧时指定帧计时,这样就不会对代码的其余部分提出性能要求AvassetWriterInputPixelBufferAdapter
glReadPixels
与CVPixelBufferCreate
等放在一起,锁定像素缓冲区并直接写入其基址。希望您能得到一些可以直接传递给OpenGL的内容,而不需要在其间移动字节
假设iPhone有一个专用的H.264编码器,主要的性能瓶颈可能是glReadPixels,这会导致帧缓冲区中的内容需要传输并重新格式化以供CPU使用。如果你把它全部设置好,结果看起来很慢,我会首先在那里进行调查。glReadPixels和
CVPixelBuffer
的工作非常好。我唯一的问题是颜色“关”。我认为这是由于GL_RGBA
被传递到glReadPixels
和与CVPixelBuffer
一起使用的BGRA。关于这些像素格式有什么想法吗?或者我如何纠正这个问题?基于对规范的阅读,苹果的BGRA扩展似乎添加了BGRA上传,但没有下载。你可以用glReadPixels
给GL_BGRA一个镜头,但我不会乐观。失败了,我想你需要做一个通道交换提前传递缓冲区的AV基金会。在GPU上这样做可能是最便宜的——可能是渲染到纹理,向用户显示纹理,然后从纹理渲染到未显示的缓冲区,以便翻转r和b。这听起来很复杂,但另一方面,iOS 5添加了CVOpenGLESTexture
,这使得将CoreVideo图像导入OpenGL变得更加容易。