在AVFoundation中使用CIFilter(iOS)

我正在尝试在iOS上使用AVFoundation创build的video合成filter(filter可能是,例如模糊,像素化,深褐色等)。 我需要实时应用这些效果,并且能够将复合video渲染到磁盘上,但我很高兴从一个或另一个开始。

不幸的是,我似乎无法找出这一个。 以下是我能做的事情:

  • 我可以为正在播放电影的UIView添加一个animation层,但是如果我能够以这种方式处理传入的video图像,我不清楚。
  • 我可以添加一个CIFilters数组到AVPlayerLayer,但事实certificate,这些在iOS中被忽略(它只适用于Mac OS X)。
  • 我可以添加一个AVVideoCompositionCoreAnimationTool到AVVideoCompopsition,但我不确定这将完成video处理(而不是animation),并且会崩溃,并且不会被devise用于实时播放。 我相信这是渲染到磁盘时渲染animation的解决scheme。

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

注意:我已经研究过GPUImage,我很乐意使用它,但是对于电影,特别是带有audio的电影来说,这并不适用。 看例如:

  • 在AVMutableComposition中,GPUImage在运行时过滤
  • https://github.com/BradLarson/GPUImage/issues/1339

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

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]; 

然后像苹果的文档中所描述的那样使用OpenGL渲染像素缓冲区。 这将允许您实现任意数量的过渡或filter,你想要的。 然后,您可以设置AVAssetExportSession.videoCompostion,您将能够将合成video导出到磁盘。

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

您可以阅读有关CIFilter应用程序的video(将滤镜应用于video部分):

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