对视频文件应用过滤器
Posted
技术标签:
【中文标题】对视频文件应用过滤器【英文标题】:Applying filters on a video file 【发布时间】:2013-08-29 07:46:06 【问题描述】:我想在视频播放时对视频文件应用滤镜(效果)。
我目前正在使用@BradLarson 的(很棒的)GPUImage
框架来执行此操作,这里的问题是该框架在播放视频时不支持音频播放。
所以我有两个选择:
1) 深入了解GPUImage
代码并更改GPUImageMovie
,这样它也将处理音频缓冲区。这需要同步音频和视频帧的知识,不幸的是我没有。我看到一些黑客尝试使用AVAudioPlayer
播放音频,但存在很多同步问题。
2) 使用CoreImage
框架而不是GPUImage
。
所以我想看看使用原生 ios CoreImage
和 CIFilter
来完成这项工作的第二个选项。
问题是,我找不到任何关于如何使用 CIFilter
执行此操作的示例,如何对文件中的视频应用过滤器?
我必须使用AVAssetReader
来阅读视频并处理每一帧吗?如果是这样,我又回到了同步音频和视频的第一个问题。
或者有没有办法直接在视频或预览层上应用过滤器链?
感谢任何帮助:)
【问题讨论】:
我当然希望能在添加音频播放方面提供任何帮助。这不是我非常熟悉的领域,甚至音频录制支持也是由其他人添加的。我所做的只是尝试调整性能。 @BradLarson 我真的很惊讶直到现在还没有人实现它,特别是因为有这么多人使用并为 GPUImage 做出贡献 我已经完成了一些使用 AVComposition 合成多个视频和音频轨道的工作,我可以解决同步问题。我不知道如何将音频添加到 GPUImage。但是,我可以提供一个可能有帮助的示例项目 - 它被称为来自 Apple 的 RosyWriter,它处理在 AVCapture 会话期间添加过滤器:apple.developer.apple.com/library/ios/samplecode/RosyWriter/… 您可能对这条最近的 GitHub 评论感兴趣:github.com/BradLarson/GPUImage/issues/458#issuecomment-23704744 感谢@BradLarson 实际上我参与了编写此解决方案 :) 除了编写自己的实现之外,我们找不到任何其他方法。 【参考方案1】:仅使用您正在使用的 GPUImage 框架... 这是迄今为止视频过滤器的最佳框架。浏览框架的文档https://github.com/BradLarson/GPUImage 向下滚动页面,您将找到可用过滤器的详细信息...
此过滤器应用于视频,要编写视频,您必须使用 GPUImageMovieWriter 类...它会自动处理音频..
您不必维护它...使用 GPUImageMovieWriter 的 shouldPassThroughAudio 属性,它将自行管理音频。
使用本教程寻求帮助http://www.sunsetlakesoftware.com/2012/02/12/introducing-gpuimage-framework
这是我使用 GPUImage 框架裁剪视频和音频的代码,在编辑后未删除。
NSURL *videoUrl = [selectedAsset defaultRepresentation].url;
GPUImageMovie *movieUrl = [[GPUImageMovie alloc] initWithURL:videoUrl];
self.cropFilter = [[GPUImageCropFilter alloc] initWithCropRegion:videoArea];
movieUrl.runBenchmark = YES;
movieUrl.playAtActualSpeed = YES;
[movieUrl addTarget:self.cropFilter];
//Setting path for temporary storing the video in document directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *myPathDocs = [documentsDirectory stringByAppendingPathComponent:
[NSString stringWithFormat:@"CroppedVideo-%d.mov",arc4random() % 1000]];
NSURL *movieURL = [NSURL fileURLWithPath:myPathDocs];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:videoUrl options:nil];
AVAssetTrack *videoAssetTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
CGAffineTransform videoTransform = videoAssetTrack.preferredTransform;
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(videoAssetTrack.naturalSize.width, videoAssetTrack.naturalSize.height)];
[_cropFilter addTarget:movieWriter];
movieWriter.shouldPassthroughAudio = YES;
movieUrl.audioEncodingTarget = movieWriter;
[movieUrl enableSynchronizedEncodingUsingMovieWriter:movieWriter];
[self.movieWriter startRecordingInOrientation:videoTransform];
[self.movieWriter startRecording];
[movieUrl startProcessing];
__block BOOL completeRec = NO;
__unsafe_unretained typeof(self) weakSelf = self;
[self.movieWriter setCompletionBlock:^
[weakSelf.cropFilter removeTarget:weakSelf.movieWriter];
[weakSelf.movieWriter finishRecording];
[movieUrl removeTarget:weakSelf.cropFilter];
if (!completeRec)
[weakSelf videoCropDoneUrl:movieURL];
completeRec = YES;
];
【讨论】:
这些都不能帮助他们使用框架播放电影中的音频,因为框架中目前不存在该功能。 @BradLarson 哦!这就是原因。我很久以前就下载了你的课程。 @ParvezBelim GPUImage 在技术上是一个框架,而不是一个“类”。 如何在录制的视频中添加滤镜【参考方案2】:您可以使用 OpenCV 框架来玩视频编辑..
这里是下载 OpenCv 的链接
http://sourceforge.net/projects/opencvlibrary/files/opencv-ios/2.4.6/opencv2.framework.zip/download
这里有一个使用 OpenCV 的教程
http://docs.opencv.org/doc/tutorials/ios/video_processing/video_processing.html#opencviosvideoprocessing
我想这会对你有所帮助..
【讨论】:
【参考方案3】:虽然解决方案 2 听起来像是一个“OK”的解决方案,但如果它是我的应用程序,我仍然更喜欢使用 GPUImage 视频过滤器。
解决方案:
-
获取原始视频并从中撕下音轨。 (最好在后台线程中)使用https://github.com/unixpickle/MP4Audio
让用户使用 GPUImage 选择他的视频滤镜,处理视频并保存。
视频准备就绪后,将新编辑的过滤视频与您在 GPUImage 干预之前保存的音轨合并。 (进行合并的方法很多,这里是其中之一:Merging Audio with Video Objective-C
)
莎娜托娃
【讨论】:
以上是关于对视频文件应用过滤器的主要内容,如果未能解决你的问题,请参考以下文章
尝试将 CIImage 与从视频文件帧获得的纹理一起使用时,CIImage 为空白