在iOS中使用AVFoundation和CIFilter

7
我正在尝试对iOS上使用AVFoundation创建的视频合成应用滤镜(例如模糊、像素化、棕褐色等)。我需要实时应用效果并能够将复合视频渲染到磁盘上,但我很高兴只从中选择一个开始。
不幸的是,我似乎无法解决这个问题。以下是我所能做的:
- 我可以为播放电影的UIView添加动画层,但我不确定是否可以通过这种方式处理传入的视频图像。 - 我可以向AVPlayerLayer添加CIFilters数组,但结果发现它们在iOS上被忽略了(它只在Mac OS X上有效)。 - 我可以向AVVideoComposition添加AVVideoCompositionCoreAnimationTool,但我不确定这是否会完成视频处理(而不是动画),并且它会因未设计用于实时播放而崩溃。我认为这是在渲染到磁盘时渲染动画的解决方案。
其他应用程序也可以做到这一点(我想),所以我认为我可能遗漏了一些显而易见的东西。
注意:我已经调查了GPUImage,并且很想使用它,但它在处理电影,特别是带有音频的电影方面表现不佳。例如,请参阅:

你找到了什么吗?能否提供一些教程或代码片段?我也遇到了同样的问题。 - Mrugesh Tank
我得到了一些帮助并使用了GPUImage。它非常强大,但很难让它与电影协调起来。老实说,我无法记住我必须经历的所有步骤,但我相信如果我这样做,答案会太长了:( - Bjorn Roche
2个回答

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

按照苹果的文档中描述的方法,使用OpenGL渲染像素缓冲区。这将使您能够实现任意数量的过渡或滤镜效果。然后,您可以设置AVAssetExportSession.videoCompostion,并能够将合成的视频导出到磁盘。


你是用OpenGL渲染像素缓冲区,而不仅仅是使用“finishWithComposedVideoFrame:”将帧传回的吗? - bcattle
请问您能否提供一些使用 AVVideoCompositingAVAsynchronousVideoCompositionRequest 的代码片段? - Mrugesh Tank
1
这是来自苹果的一些示例代码 - AVCustomEdit-iOS 我认为你可能会感兴趣的类是 APLCrossDissolveRenderer,你可能想要查看的方法是 - (void)renderPixelBuffer:(CVPixelBufferRef)destinationPixelBuffer usingForegroundSourceBuffer:(CVPixelBufferRef)foregroundPixelBuffer... - Jonathan
这里有一个更好的版本,使用纯CoreImage实现 https://dev59.com/z7fna4cB1Zd3GeqPmRhq#58641966 - Alexander Vasenin

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接