我正在尝试将过滤器应用于在iOS上使用AVFoundation创建的视频合成(过滤器可能是,例如,模糊,像素化,棕褐色等).我需要实时应用效果并能够将复合视频渲染到磁盘,但我很高兴从一个或另一个开始.
不幸的是,我似乎无法想出这个.这是我能做的:
我可以为正在播放电影的UIView添加一个动画层,但是我不清楚我是否可以这样处理传入的视频图像.
我可以向AVPlayerLayer添加一组CIFilter,但事实证明这些在iOS中被忽略(它只适用于Mac OS X).
我可以将一个AVVideoCompositionCoreAnimationTool添加到AVVideoCompopsition,但我不确定这会完成视频处理(而不是动画),并且它会因为无法设计用于实时播放的消息而崩溃.我相信这是渲染到磁盘时渲染动画的解决方案.
其他应用程序这样做(我认为),所以我认为我错过了一些明显的东西.
注意:我已经研究过GPUImage,我很乐意使用它,但它对电影,尤其是带有音频的电影效果不佳.参见例如:
GPUImage在AVMutableComposition上运行时过滤
https://github.com/BradLarson/GPUImage/issues/1339
小智.. 6
您可以使用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];
然后使用Apple的文档中描述的OpenGL渲染像素缓冲区.这将允许您实现所需的任意数量的转换或过滤器.然后,您可以设置AVAssetExportSession.videoCompostion,然后您就可以将合成视频导出到磁盘.
您可以使用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];
然后使用Apple的文档中描述的OpenGL渲染像素缓冲区.这将允许您实现所需的任意数量的转换或过滤器.然后,您可以设置AVAssetExportSession.videoCompostion,然后您就可以将合成视频导出到磁盘.