将CIFilter与AVFoundation一起使用(iOS)

Bjo*_*che 7 video core-image avfoundation ios

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

不幸的是,我似乎无法想出这个.这是我能做的:

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

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

注意:我已经研究过GPUImage,我很乐意使用它,但它对电影,尤其是带有音频的电影效果不佳.参见例如:

小智 6

您可以使用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];
Run Code Online (Sandbox Code Playgroud)

然后使用Apple的文档中描述的OpenGL渲染像素缓冲区.这将允许您实现所需的任意数量的转换或过滤器.然后,您可以设置AVAssetExportSession.videoCompostion,然后您就可以将合成视频导出到磁盘.


Laz*_*Laz 3

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

您可以阅读有关 CIFilter 应用到视频的信息(将过滤器应用到视频部分):

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