【问题标题】:approach for recording grayscale video on iphone?在iphone上录制灰度视频的方法?
【发布时间】:2011-03-23 03:15:13
【问题描述】:

我正在构建一个需要录制灰度视频并将其保存到相机胶卷的 iphone 应用程序。我不知道如何最好地解决这个问题。

我的想法是这样的:

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

我的问题是:

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

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

【问题讨论】:

    标签: iphone objective-c opengl-es avfoundation


    【解决方案1】:

    总的来说,我同意这种方法。在 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 作为输入像素缓冲区的颜色格式。然后,在使用glReadPixels() 时,您需要使用颜色混合着色器重新渲染您的 RGBA 场景以提供 BGRA 输出。如果没有此颜色设置,您的视频录制帧率将在 iPhone 4 上降至 5-8 FPS,而使用它,它们很容易达到 30 FPS。您可以查看 GPUImageMovieWriter 类源代码,了解更多关于我是如何做到这一点的。

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

    【讨论】:

    • 感谢您的反馈。我将尝试实施这种方法,看看它的表现如何。
    • 谢谢布拉德!我尝试了这种方法,效果很好,但我确实有一个问题。我使用 glReadPixels() 捕获的结果图像在预览视口的大小中。我正在捕获的视频应该大于 iPhone 屏幕(480 * 640)。有没有办法应用着色器,这样我就可以在屏幕上查看它(减小尺寸)并将其保存到原始相机中的磁盘尺寸(在我的情况下为 640*480)?
    • @AmirNaor - 是的,您只需要创建一个与您要处理的视频一样大的屏幕外帧缓冲区。在我上面链接的示例中,我创建了一个比 iPhone 4 的显示屏更小的屏幕外缓冲区来进行颜色处理,因此您可以将其设置为大于屏幕。如果您将结果用作纹理,然后将该纹理用于屏幕大小的矩形,您应该能够对其进行下采样以用于屏幕就好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多