在视频文件上应用过滤器

时间:2013-08-29 07:46:06

标签: ios objective-c core-image gpuimage

我想在视频播放时对视频文件应用滤镜(效果)。

我目前正在使用@BradLarson的(伟大的)GPUImage框架来解决这个问题,这里的问题是框架在播放视频时不支持音频播放。

所以我有两个选择:

1)深入GPUImage代码并更改GPUImageMovie,这样它也会处理音频缓冲区。这需要同步音频和音频的知识。视频帧,不幸的是我没有它。我看到一些黑客尝试用AVAudioPlayer播放音频,但有很多同步问题。

2)使用CoreImage框架代替GPUImage

所以我想看一下使用原生iOS CoreImageCIFilter来完成工作的第二个选项。

问题是,我找不到任何关于如何使用CIFilter执行此操作的示例,如何对来自文件的视频应用过滤器

我必须使用AVAssetReader来阅读视频并处理每一帧吗?如果是这样,我又回到了第一个同步音频和音频的问题。视频。
或者有没有办法直接在视频或预览图层上应用滤镜链?

感谢任何帮助:)

3 个答案:

答案 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的教程

http://docs.opencv.org/doc/tutorials/ios/video_processing/video_processing.html#opencviosvideoprocessing

我认为这会对你有帮助..

答案 2 :(得分:0)

虽然解决方案2听起来像一个“OK”解决方案,如果它是我的应用程序,我仍然更喜欢使用GPUImage视频过滤器。

<强>解决方案

  1. 获取原始视频并撕掉音频轨道。 (最好在后台线程中),例如https://github.com/unixpickle/MP4Audio
  2. 让用户选择带有GPUImage的视频过滤器,处理视频并保存。
  3. 视频准备就绪后,将新编辑的过滤视频与您在GPUImage干预前保存的音轨合并。 (进行合并的方法很多,其中之一是:Merging Audio with Video Objective-C
  4. Shana Tova