现在已经挣扎了好几天了。我正在使用过滤器处理视频,它可以保存视频。但是,在保存之后,更新UI需要很长时间。在UI更新之前的很长一段时间里,我可以在iTunes中看到视频(带有iTunes文件共享)。
我创建这样的视图,并将其添加到我的视图控制器。这只是用户可以预览视频并选择过滤器。
-(GPUImageView*)playClipWithClip:(MYClip*)clip
{
_clip = clip;
_filterView = [[GPUImageView alloc] initWithFrame:CGRectMake(0, 0, 568, 320)];
_movieFile = [[GPUImageMovie alloc] initWithURL:[self urlForCurrentClip]];
_movieFile.runBenchmark = NO;
_movieFile.playAtActualSpeed = YES;
_movieFile.shouldRepeat = YES;
[self changeFilter];
return _filterView;
}
当用户想保存视频时,我有这个方法:
-(void)saveClipWithFilter
{
[_movieFile cancelProcessing];
_movieFile.runBenchmark = YES;
_movieFile.playAtActualSpeed = NO;
_movieFile.shouldRepeat = NO;
NSString *movieName = [self fileNameForGeneratedClip];
NSString *generatedMovieNameWithPath = [NSString stringWithFormat:@"Documents/%@",movieName];
NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:generatedMovieNameWithPath];
unlink([pathToMovie UTF8String]);
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
_movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(568, 320.0)];
[_filter addTarget:_movieWriter];
_movieWriter.shouldPassthroughAudio = NO;
[_movieFile enableSynchronizedEncodingUsingMovieWriter:_movieWriter];
[_movieWriter startRecording];
[_movieFile startProcessing];
__weak typeof(self) weakSelf = self;
[_movieWriter setCompletionBlock:^{
NSLog(@"**************************** DONE ****************************");
[weakSelf.filter removeTarget:weakSelf.movieWriter];
[weakSelf.movieWriter finishRecording];
[weakSelf exitVideoEditingModeAndSave];
}];
}
调用我的方法[weakSelf exitVideoEditingModeAndSave];
。然后该方法又调用委托(我的视图控制器)。
问题是,在调用我的委托并且我的NSLog
显示后,视图更新大约需要10秒钟。我知道该文件已准备好并已保存。
有什么想法吗?
答案 0 :(得分:3)
这是一个线程问题,在您的完成块中,在更新任何UI元素之前调度到主线程