对视频文件应用过滤器

Posted

技术标签:

【中文标题】对视频文件应用过滤器【英文标题】:Applying filters on a video file 【发布时间】:2013-08-29 07:46:06 【问题描述】:

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

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

所以我有两个选择:

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

2) 使用CoreImage 框架而不是GPUImage

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

问题是,我找不到任何关于如何使用 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 为空白

将AVAsset视频文件拆分为块

Fiddler应用实践-模拟接口超时及session过滤

如何使用FFmpeg连接两个MP4文件? concat视频过滤器concat demuxer concat协议

如何禁止微信视频聊天但是不禁止微信?

Ffmpeg 实现文件切割