OpenGL ES:将一系列纹理存储为电影文件

use*_*942 2 iphone textures opengl-es objective-c movie

我一直在从iPhone相机抓取实时视频帧并将它们作为纹理应用到平面OpenGL几何体,以便使用着色器处理相机输入.有谁知道是否可以抓取处理过的纹理并将它们存储在电影文件中?

看起来这需要很多处理能力,而且我不确定最好的方法是什么 - 或者甚至可能.这里的动机是能够对从相机抓取的视频进行有趣的着色器效果,然后存储结果以与其他人共享.

提前感谢您的想法.

Tom*_*mmy 5

我不能评论性能,但你想做的是:

  • 创建一个AVAssetWriter(可以接收传入的样本并在H.264中写出它们;当前的iOS版本似乎不支持其他文件格式)
  • 附加AVAssetWriterInput资产编写者以提供视频帧(作为资产编写者需要一个或多个输入,每个输入提供资产的不同方面);
  • 附加AVAssetWriterInputPixelBufferAdaptor资产编写器输入,以便您可以在输入处推送像素缓冲区.您需要告诉资产编写者输入实时期望媒体数据.这样做只是为了尝试随时准备输入.您可以在提供帧时指定帧时序,因此它不会对其余代码提出性能要求.

从那里,您只需要将CVImageBuffers推送到像素缓冲适配器.在OS X中有一个方便的Core Video OpenGL缓冲区类型,但似乎在iOS上没有.相反,你需要glReadPixels同时CVPixelBufferCreate锁定像素缓冲区并直接写入其基地址.希望你能得到一些你可以直接传递给OpenGL的东西,而不需要在它们之间移动字节.

假设iPhone有一个专用的H.264编码器,主要的性能瓶颈很可能是glReadPixels,导致帧缓冲区中的任何内容都需要为CPU传输和重新格式化.如果你把它全部设置好并且结果看起来很慢,那我先调查一下.