我想在视频播放时对视频文件应用滤镜(效果)。
我目前正在使用@BradLarson的(伟大的)GPUImage
框架来解决这个问题,这里的问题是框架在播放视频时不支持音频播放。
所以我有两个选择:
1)深入GPUImage
代码并更改GPUImageMovie
,这样它也会处理音频缓冲区。这需要同步音频和音频的知识。视频帧,不幸的是我没有它。我看到一些黑客尝试用AVAudioPlayer
播放音频,但有很多同步问题。
2)使用CoreImage
框架代替GPUImage
。
所以我想看一下使用原生iOS CoreImage
和CIFilter
来完成工作的第二个选项。
问题是,我找不到任何关于如何使用CIFilter
执行此操作的示例,如何对来自文件的视频应用过滤器?
我必须使用AVAssetReader
来阅读视频并处理每一帧吗?如果是这样,我又回到了第一个同步音频和音频的问题。视频。
或者有没有办法直接在视频或预览图层上应用滤镜链?
感谢任何帮助:)
答案 0 :(得分:3)
仅使用您正在使用的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;
}
}];
答案 1 :(得分:0)
您可以使用OpenCV框架来播放视频编辑..
这是下载OpenCv
的链接http://sourceforge.net/projects/opencvlibrary/files/opencv-ios/2.4.6/opencv2.framework.zip/download
这是一个使用OpenCV的教程
我认为这会对你有帮助..
答案 2 :(得分:0)
虽然解决方案2听起来像一个“OK”解决方案,如果它是我的应用程序,我仍然更喜欢使用GPUImage视频过滤器。
<强>解决方案强>:
Shana Tova