在iPhone上录制灰度视频的方法?

时间:2011-03-23 03:15:14

标签: iphone objective-c opengl-es avfoundation

我正在构建一个需要录制灰度视频并将其保存到相机胶卷的iPhone应用程序。我很难接受这个问题。

我正在考虑以下几点:

  1. 使用着色器和opengl将视频转换为灰度
  2. 使用AVFoundation(AVAssetWriter和AVAssetWriterInputPixelBufferAdaptor)将视频写入文件。
  3. 我的问题是:

    1. 这是正确的方法(最简单,最佳性能)吗?
    2. 如果是这样,那么从opengl输出到AVAssetWriterInputPixelBufferAdaptor的CVPixelBufferRef输入的最佳方法是什么?
    3. 如果没有,那会是更好的方法吗?
    4. 非常感谢任何朝着正确方向的推动!

1 个答案:

答案 0 :(得分:4)

总的来说,我同意这种方法。在OpenGL ES 2.0着色器中进行处理应该是像这样进行视频帧更改的最高效方式,但这不会非常简单。幸运的是,您可以从已经存在的模板开始。

您可以使用我编写的示例应用程序here(并解释here)作为基础。我在此示例中使用自定义着色器来跟踪图像中的颜色,但您可以轻松地将其更改为将视频帧转换为灰度(我甚至看到有人这样做过一次)。将摄像机视频输入纹理并对其进行处理的代码可以从该样本中逐字使用。

在该应用程序中的一个显示选项中,我首先将处理后的图像渲染到帧缓冲对象,然后使用glReadPixels()将生成的图像拉回到我可以在CPU上使用的字节。您可以使用它在GPU处理完帧后获取原始图像数据,然后将这些字节输入CVPixelBufferCreateWithBytes()以生成CVPixelBufferRef以写入磁盘。

(编辑:2/29/2012)作为对此的更新,我刚刚在我的开源GPUImage框架中实现了这种视频录制,因此我可以评论编码部分的具体性能。这个。事实证明,您可以从相机捕获视频,对其执行实时过滤,使用glReadPixels()从OpenGL ES中获取视频,然后在iPhone 4上以30 FPS将其写为640x480帧中的实时H.264视频(最大相机帧速率)。

为了获得这种录制速度,我需要做一些事情。您需要确保将AVAssetWriterInputPixelBufferAdaptor设置为使用kCVPixelFormatType_32BGRA作为输入像素缓冲区的颜色格式。然后,您需要使用色彩混合着色器重新渲染RGBA场景,以便在使用glReadPixels()时提供BGRA输出。如果没有这种颜色设置,您的视频录制帧速率将降至iPhone 4的5-8 FPS,使用它可轻松达到30 FPS。您可以查看GPUImageMovieWriter类源代码,以了解有关我如何执行此操作的更多信息。

使用GPUImage框架,可以通过简单地创建GPUImageVideoCamera,附加饱和度设置为0的GPUImageSaturationFilter的目标,然后附加GPUImageMovieWriter作为其目标来处理上述过滤和编码任务。该框架将为您处理OpenGL ES交互。我做到了这一点,它在我测试的所有iOS设备上运行良好。