17

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

我目前正在使用@BradLarson 的(很棒的)GPUImage框架来执行此操作,这里的问题是该框架在播放视频时不支持音频播放。

所以我有两个选择:

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

2) 使用CoreImage框架而不是GPUImage.

所以我想看看使用本机 iOS 的第二个选项CoreImageCIFilter完成这项工作。

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

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

感谢任何帮助:)

4

3 回答 3

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;
    }
}];
于 2013-09-07T19:03:34.703 回答
0

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

解决方案

  1. 获取原始视频并从中撕下音轨。(最好在后台线程中)类似于https://github.com/unixpickle/MP4Audio
  2. 让用户用 GPUImage 选择他的视频滤镜,处理视频并保存。
  3. 视频准备好后,将新编辑的过滤视频与您在 GPUImage 干预之前保存的音轨合并。(进行合并的方法很多,这里是其中之一:Merging Audio with Video Objective-C

莎娜托娃

于 2013-09-04T23:36:38.457 回答
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

我想这会对你有所帮助..

于 2013-08-29T09:41:15.950 回答