繁体   English   中英

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

[英]approach for recording grayscale video on iphone?

我正在构建一个需要录制灰度视频并将其保存到相机胶卷的iPhone应用程序。 我很难理解如何最好地接近这一点。

我在考虑以下几点:

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

我的问题是:

  1. 这是正确的方法(最简单,最佳性能)吗?
  2. 如果是这样,那么从opengl输出到AVAssetWriterInputPixelBufferAdaptor的CVPixelBufferRef输入的最佳方法是什么?
  3. 如果没有,那会是更好的方法吗?

任何推动正确的方向非常感谢!

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM