Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone OpenGL ES:将一系列纹理存储为电影文件_Iphone_Objective C_Opengl Es_Textures_Movie - Fatal编程技术网

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

Iphone OpenGL ES:将一系列纹理存储为电影文件,iphone,objective-c,opengl-es,textures,movie,Iphone,Objective C,Opengl Es,Textures,Movie,我一直在从iPhone摄像头抓取实时视频帧,并将其作为纹理应用于平面OpenGL几何体,以便使用着色器处理摄像头输入。有人知道是否有可能抓取处理过的纹理并将其存储在电影文件中吗 这似乎需要很大的处理能力,我不确定最好的方法是什么——或者是否可能。这里的动机是能够对从相机抓取的视频执行有趣的着色器效果,然后存储结果以与其他人共享 提前感谢您的想法。我无法评论性能,但您想做的是: 创建一个AVAssetWriter(它可以获取传入的样本并将其写入H.264;当前iOS版本似乎不支持其他文件格式)

我一直在从iPhone摄像头抓取实时视频帧,并将其作为纹理应用于平面OpenGL几何体,以便使用着色器处理摄像头输入。有人知道是否有可能抓取处理过的纹理并将其存储在电影文件中吗

这似乎需要很大的处理能力,我不确定最好的方法是什么——或者是否可能。这里的动机是能够对从相机抓取的视频执行有趣的着色器效果,然后存储结果以与其他人共享


提前感谢您的想法。

我无法评论性能,但您想做的是:

  • 创建一个
    AVAssetWriter
    (它可以获取传入的样本并将其写入H.264;当前iOS版本似乎不支持其他文件格式)
  • AVAssetWriterInput
    附加到资产写入器以提供视频帧(资产写入器接收一个或多个输入,每个输入提供资产的不同方面)
  • AvassetWriterInputPixelBufferAdapter
    附加到asset writer输入,以便可以在输入端推送像素缓冲区。您需要告诉asset writer输入它需要实时的媒体数据。这样做只会告诉它要时刻准备好输入。您可以在提供帧时指定帧计时,这样就不会对代码的其余部分提出性能要求
从这里开始,您只需将CVImageBuffers推送到像素缓冲适配器。OSX中有一种方便的核心视频OpenGL缓冲区类型,但在iOS上似乎没有。相反,您需要将
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变得更加容易。