【问题标题】:Using CIFilter with AVFoundation (iOS)将 CIFilter 与 AVFoundation (iOS) 一起使用
【发布时间】:2014-01-04 19:14:07
【问题描述】:

我正在尝试将过滤器应用于在 iOS 上使用 AVFoundation 创建的视频合成(过滤器可以是模糊、像素化、棕褐色等)。我需要实时应用效果并能够将复合视频渲染到磁盘上,但我很乐意从其中一个开始。

不幸的是,我似乎无法弄清楚这一点。这是我能做的:

  • 我可以为正在播放电影的 UIView 添加一个动画层,但我不清楚是否可以通过这种方式处理传入的视频图像。
  • 我可以将一组 CIFilter 添加到 AVPlayerLayer,但事实证明这些在 iOS 中被忽略(它仅适用于 Mac OS X)。
  • 我可以将 AVVideoCompositionCoreAnimationTool 添加到 AVVideoCompopsition,但我不确定这是否会完成视频处理(而不是动画),并且它会崩溃并显示无论如何都不是为实时播放而设计的消息。我相信这是渲染到磁盘时渲染动画的解决方案。

其他应用程序会这样做(我认为),所以我认为我遗漏了一些明显的东西。

注意:我研究了 GPUImage,我很想使用它,但它不适用于电影,尤其是有音频的电影。例如:

【问题讨论】:

  • 你找到什么了吗?你能提供一些教程或代码sn-p吗?我有同样的问题
  • 我得到了一些帮助并使用了 GPUImage。它非常强大,但很难让它与电影一起播放。老实说,我不记得我必须经历的所有步骤,但我敢肯定,如果我这样做了,这里的答案太长了:(

标签: ios video avfoundation core-image


【解决方案1】:

您可以使用 AVAssetReader 读取 AVComposition(它是 AVAsset 子类)。获取像素缓冲区,将其传递给 CIFilter(设置它以便它使用 GPU 进行渲染(无颜色管理等)并根据您的需要在屏幕/输出缓冲区上渲染它。我不认为可以实时实现模糊,除非您直接使用 GPU。

您可以阅读 CIFilter application to video(Applying Filter to Video 部分):

https://developer.apple.com/library/ios/documentation/graphicsimaging/conceptual/CoreImaging/ci_tasks/ci_tasks.html#//apple_ref/doc/uid/TP30001185-CH3-BAJDAHAD

【讨论】:

    【解决方案2】:

    您可以使用AVVideoCompositingAVAsynchronousVideoCompositionRequest 协议来实现自定义合成器。

    CVPixelBufferRef pixelBuffer = [AVAsynchronousVideoCompositionRequest sourceFrameByTrackID:trackID];
    CIImage *theImage = [CIImage imageWithCVPixelBuffer:pixelBuffer];
    CIImage *motionBlurredImage = [[CIFilter *filterWithName:@"CIMotionBlur" keysAndValues:@"inputImage", theImage, nil] valueForKey:kCIOutputImageKey];
    CIContext *someCIContext = [CIContext contextWithEAGLContext:eaglContext];
    [someCIContext render:motionBlurredImage toCVPixelBuffer:outputBuffer];
    

    然后按照Apple's Documentation 中的说明使用 OpenGL 渲染像素缓冲区。这将允许您实现任意数量的转换或您想要的过滤器。然后您可以设置 AVAssetExportSession.videoCompostion 并且您将能够将合成视频导出到磁盘。

    【讨论】:

    • 您使用 OpenGL 渲染像素缓冲区,而不是使用 finishWithComposedVideoFrame: 将帧传回?
    • 能否请您提供一些使用AVVideoCompositingAVAsynchronousVideoCompositionRequest的代码sn-p?
    • 这里是来自苹果的一些示例代码 - AVCustomEdit-iOS 我认为您将感兴趣的类是 APLCrossDissolveRenderer 您可能想要查看的方法是 - (void)renderPixelBuffer:(CVPixelBufferRef)destinationPixelBuffer usingForegroundSourceBuffer:(CVPixelBufferRef)foregroundPixelBuffer...
    • 这里是纯CoreImage的更好版本stackoverflow.com/a/58641966/2432781
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2017-11-06
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多