Filter 使用GPUImage框架在过滤器链之间切换
我想用下面的代码在两个过滤器链之间切换,如案例1和案例2所示。当我最初选择其中一种情况时,输出显示正确。但是,当我切换到另一个过滤器链时,输出在当前过滤器链和先前过滤器链之间闪烁。切换过滤链的建议方法是什么Filter 使用GPUImage框架在过滤器链之间切换,filter,gpuimage,chain,Filter,Gpuimage,Chain,我想用下面的代码在两个过滤器链之间切换,如案例1和案例2所示。当我最初选择其中一种情况时,输出显示正确。但是,当我切换到另一个过滤器链时,输出在当前过滤器链和先前过滤器链之间闪烁。切换过滤链的建议方法是什么 -(void) updateFilter:(NSInteger) style { switch (style) { case 1: [kuwahara setRadius:5]; [videoCamera addTarget:kuwahara];
-(void) updateFilter:(NSInteger) style {
switch (style) {
case 1:
[kuwahara setRadius:5];
[videoCamera addTarget:kuwahara];
[kuwahara addTarget:grayscale];
[grayscale addTarget:filteredVideoView];
break;
case 2:
[videoCamera addTarget:grayscale];
[blur setBlurSize:3];
[grayscale addTarget:blur];
[blur addTarget:colorinvert];
[colorinvert addTarget:filteredVideoView];
break;
default:
[videoCamera addTarget:filteredVideoView];
break;
}
[videoCamera startCameraCapture];
}
根据应用程序的情况,您可能还需要考虑GPUMIGIFILTER管道类。
它将负责添加和删除Brad引用的所有干预目标 如果这些过滤器的重复设置/拆卸对您来说是有问题的,但是在类的生命周期中将它们保留在内存中不是问题,那么您可能会喜欢管道 大致根据您提供的内容,它可能看起来像这样:- (void)configureSomeArraysOfFilters {
_setNumberOne = [[NSMutableArray alloc] init]; //make sure these arrays are at least scoped to the class, if not actual @properties
GPUImageKuwaharaFilter* kuwahara = [[GPUImageKuwaharaFilter alloc] init];
[kuwahara setRadius:5];
GPUImageGrayscaleFilter* gray = [[GPUImageGrayscaleFilter alloc] init];
[_setNumberOne addObject:kuwahara];
[_setNumberOne addObject:gray];
_setNumberTwo = [[NSMutableArray alloc] init];
GPUImageGrayscaleFilter* otherGray = [[GPUImageGrayscaleFilter alloc] init];
GPUImageGaussianBlurFilter* blur = [[GPUImageGaussianBlurFilter alloc] init];
[blur setBlurSize:3];
GPUImageColorInvertFilter* invert = [[GPUImageColorInvertFilter alloc] init];
[_setNumberTwo addObject:otherGray];
[_setNumberTwo addObject:blur];
[_setNumberTwo addObject:invert];
}
- (void)configureAnEmptyPipeline {
if (_samplePipeline == nil) {
GPUImageFilter* passthrough = [[GPUImageFilter alloc] init];
NSArray* empty = [NSArray arrayWithObjects:passthrough, nil];
_samplePipeline = [[GPUImageFilterPipeline alloc] initWithOrderedFilters:empty input:videoCamera output:_filteredVideoView];
[videoCamera startCameraCapture];
}
}
- (void)updateFilterPipeline:(NSInteger)style {
switch (style) {
case 1:
[_samplePipeline replaceAllFilters:_setNumberOne];
break;
case 2:
[_samplePipeline replaceAllFilters:_setNumberTwo];
//add as many more cases as you have defined Arrays full of filters for
default:
break;
}
}
然而,我最喜欢的管道用例是在运行时动态创建过滤器集,然后将它们切换为操作。它允许我简单地按顺序存储过滤器,然后将它们传递到管道,而无需每次指定每个过滤器之间的所有目标
这并不适用于所有情况,但GPUImageFilterPipeline在某些情况下非常有用。我看不到您将旧过滤器作为摄像机的目标删除,或将视频视图作为旧过滤器链的目标删除。请确保您正在这样做(请参阅Mac FilterShowcase示例了解我在这种情况下是如何做到的),否则视频将继续从一个源馈送到多个过滤器链中。感谢您的回复。有趣的方法。