GPUImageFilter的多次时间分配使应用程序崩溃

时间:2013-10-21 13:48:12

标签: iphone ios objective-c gpuimage

我正在制作图片/视频滤镜效果项目。为了生效我正在使用GPUImage项目。它适用于图片。现在我也需要对视频做同样的效果。我以每秒30帧的速度从视频中抓取图像。现在1分钟视频我过滤了大约1800张图像。并过滤,为每个图像我分配GPUImagePicture和GPUImageSepiaFilter类,并手动释放它们。但是这些分配没有被释放,并且在处理大约20秒视频应用程序因内存警告而崩溃之后。 是否可以分配GPUImagePicture和Filter类一次,以便对所有图像进行过滤。如果有,怎么样? 请告诉我它会非常有帮助。 这是我的代码,我正在做什么......

获取图像方法由NSTimer调用,每秒调用30次,从app文档目录获取图像并发送过滤到 - (void)imageWithEffect:(UIImage *)图像方法。

-(void)getImage
{
    float currentPlayBacktime =  slider.value;
    int frames = currentPlayBacktime*30;
    NSString *str = [NSString stringWithFormat:@"image%i.jpg",frames+1];

    NSString *fileName = [self.imgFolderPath stringByAppendingString:str];
    if ([fileManager fileExistsAtPath:fileName])
        [self imageWithEffect:[UIImage imageWithContentsOfFile:fileName]];


}


- (void)imageWithEffect:(UIImage *)image
{


        GPUImagePicture *gpuPicture = [[GPUImagePicture alloc]initWithImage:img] ;
        GPUImageSepiaFilter *filter = [[[GPUImageSepiaFilter alloc]init] autorelease];
         gpuPicture = [gpuPicture initWithImage:image];
        [gpuPicture addTarget:filter];
        [gpuPicture processImage];

        playerImgView.image = [filter imageFromCurrentlyProcessedOutputWithOrientation:0];

        [gpuPicture removeAllTargets];

        [filter release];
        [gpuPicture release];

}

1 个答案:

答案 0 :(得分:1)

为什么要将电影处理成一系列静止的UIImages?为什么要为每个图像分配新的过滤器?那将是非常缓慢的。

相反,如果您需要处理电影文件,请使用GPUImageMovie输入,如果需要访问摄像头,请使用GPUImageVideoCamera输入。这两个都经过调整,可通过过滤器管道提供快速视频输入。在将静止帧转换为UIImages时会浪费很多处理周期。

此外,只设置一次过滤器,并根据需要重复使用。在创建GPUImageFilter(设置FBO等)时会产生很大的开销,因此您只想创建一次,然后在输入和输出发生变化时附加它们。