重用滤镜导致GPUImage黑屏

Posted

技术标签:

【中文标题】重用滤镜导致GPUImage黑屏【英文标题】:Reusing filter Causes black screen in GPUImage 【发布时间】:2012-11-05 09:49:47 【问题描述】:

我创建了一组GPUImageToneCurveFilter 并存储在一个数组中。

首先,在选择任何过滤器后,我使用 GPUImageVideoCamera 为所有过滤器创建预览视频视图,我尝试添加该过滤器详细视图 (GPUImageStillCamera)。但是我为此得到了黑屏。

如果我重新创建新过滤器而不是重复使用,然后添加到 GPUImageStillCamera 它工作正常。 任何解决方案。

预览视图创建代码:

    -(void)setUpUI

    self.videoView.fillMode = kGPUImageFillModePreserveAspectRatioAndFill;
    




-(void)addFilter:(id)filter
        
        // For thumbnails smaller than the input video size, we currently need to make them render at a smaller size.
        // This is to avoid wasting processing time on larger frames than will be displayed.
        // You'll need to use -forceProcessingAtSize: with a zero size to re-enable full frame processing of video.
        self.filter = filter;
        [filter forceProcessingAtSize:self.videoView.sizeInPixels];
        [[CameraProvider sharedProvider] addTarget:filter];
        [filter addTarget:self.videoView];

        [[CameraProvider sharedProvider] startCameraCapture];
        self.titleLabel.text = [filter fliterName];
        



 -(void)stopCamera
        
        [self.filter removeAllTargets];
        [[CameraProvider sharedProvider] removeTarget:self.filter];
        [[CameraProvider sharedProvider] stopCameraCapture];

        



-(IBAction)selectionDone:(id)sender  

            [[CameraProvider sharedProvider] removeInputsAndOutputs]; 
             self.selectedFilter(self.filter);

     


 // Adding to detail view (GPUImageStillCamera0:





  - (void)didSelectFilter:(id)newfilter;
        
        NSLog(@"fliter");
        // newfilter = [[GPUImageToneCurveFilter alloc] initWithACV:@"california-gold-rush.acv"];
        [newfilter prepareForImageCapture];
        [stillCamera addTarget:newfilter];
        [newfilter addTarget:self.imageView];

        [stillCamera startCameraCapture];
    

【问题讨论】:

即使我在这里创建了问题github.com/BradLarson/GPUImage/issues/598,但还没有回答。 【参考方案1】:

如果我重新创建新过滤器而不是重复使用,然后添加到 GPUImageStillCamera 它工作正常。

我不愿说出显而易见的事实,但解决方案是在需要时重新创建过滤器,而不是尝试重复使用它。

您想要从该数组中获得“一种在给定索引的情况下获取过滤器对象的方法”。有很多方法可以获取该过滤器对象。其中之一是预先分配一个数组并索引到数组中。另一种方法是编写一个函数,给定一个索引,返回一个新创建的对象,该对象的类型与您从数组中检索到的类型相同。不要使用过滤器数组,而是使用过滤器的工厂数组。

【讨论】:

我重新创建并使用过,但我担心重复使用可以节省内存和不需要的娱乐代码..感谢您的建议 与输入/输出纹理相比,我认为着色器不会使用太多内存,所以应该没问题。至于不需要的娱乐,我在滑块移动时重新创建了我的着色器,速度相当慢。我目前也遇到了这个黑色图像问题。 但是每次编译着色器都会导致每次使用更多的cpu,对吗?

以上是关于重用滤镜导致GPUImage黑屏的主要内容,如果未能解决你的问题,请参考以下文章

iOS:GPUImage强大的图像处理框架

GPUImage原理

GPUImage原理

GPUImage 源码分析

GPUImage 源码分析

GPUImage的简单使用