我正在制作图片/视频滤镜效果项目。为了生效我正在使用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];
}
答案 0 :(得分:1)
为什么要将电影处理成一系列静止的UIImages?为什么要为每个图像分配新的过滤器?那将是非常缓慢的。
相反,如果您需要处理电影文件,请使用GPUImageMovie输入,如果需要访问摄像头,请使用GPUImageVideoCamera输入。这两个都经过调整,可通过过滤器管道提供快速视频输入。在将静止帧转换为UIImages时会浪费很多处理周期。
此外,只设置一次过滤器,并根据需要重复使用。在创建GPUImageFilter(设置FBO等)时会产生很大的开销,因此您只想创建一次,然后在输入和输出发生变化时附加它们。