我一直在从 iPhone 摄像头抓取实时视频帧并将它们作为纹理应用到平面 OpenGL 几何图形,以便使用着色器来处理摄像头输入。有谁知道是否有可能获取处理后的纹理并将它们存储在电影文件中?
看起来这需要大量的处理能力,我不确定最好的方法是什么——或者是否有可能。这里的动机是能够对从相机抓取的视频进行有趣的着色器效果,然后存储结果以与他人分享。
提前感谢您的想法。
我一直在从 iPhone 摄像头抓取实时视频帧并将它们作为纹理应用到平面 OpenGL 几何图形,以便使用着色器来处理摄像头输入。有谁知道是否有可能获取处理后的纹理并将它们存储在电影文件中?
看起来这需要大量的处理能力,我不确定最好的方法是什么——或者是否有可能。这里的动机是能够对从相机抓取的视频进行有趣的着色器效果,然后存储结果以与他人分享。
提前感谢您的想法。
我无法评论性能,但您想要做的是:
AVAssetWriter
(它可以获取传入的样本并以 H.264 将它们写出来;当前的 iOS 版本似乎不支持其他文件格式)AVAssetWriterInput
到资产编写器以提供视频帧(作为资产编写器接受一个或多个输入,每个输入提供资产的不同方面);AVAssetWriterInputPixelBufferAdaptor
到资产写入器输入,以便您可以在输入处推送像素缓冲区。您需要告诉资产编写器输入,它需要实时获取媒体数据。这样做只是告诉它尝试始终为输入做好准备。您可以在提供帧时指定帧计时,因此它不会对其余代码提出性能要求。从那里,您只需将 CVImageBuffers 推送到您的像素缓冲区适配器。OS X 中有一个方便的 Core Video OpenGL 缓冲区类型,但在 iOS 上似乎没有。相反,您需要glReadPixels
同时CVPixelBufferCreate
锁定像素缓冲区并直接写入其基地址。希望你能得到一些可以直接传递给 OpenGL 的东西,而不需要在两者之间打乱字节。
假设 iPhone 有一个专用的 H.264 编码器,主要的性能瓶颈可能是 glReadPixels,导致帧缓冲区中的任何内容都需要为 CPU 传输和重新格式化。如果您设置了所有内容并且结果似乎很慢,我会先在那里进行调查。