我正在尝试在视频上添加GPUImagePictureGPUImageUIElementGPUImageUIElement在工作,但是GPUImagePicture出现问题,因为我只在第一帧看到它,然后它消失了。

这是我的代码:

filter = [[GPUImageBrightnessFilter alloc] init];
[(GPUImageBrightnessFilter *)filter setBrightness:0];

GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
blendFilter.mix = 1.0;

        GPUImagePicture *overlay = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"Logo.png"] smoothlyScaleOutput:YES];
        GPUImageTransformFilter *transformFilter = [GPUImageTransformFilter new];
        [transformFilter forceProcessingAtSize:CGSizeMake(73, 83)];
        [transformFilter setAffineTransform:CGAffineTransformMakeScale(0.7, 0.7)];
        [overlay addTarget:transformFilter];
        [overlay processImage];

UIView *subview1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];
        UILabel *temperaturaText = [[UILabel alloc]initWithFrame:CGRectMake(77, 100, 105, 60)];
        temperaturaText.text = @"test";
        [subview1 addSubview:temperaturaText];
 uiElementInput = [[GPUImageUIElement alloc] initWithView:subview1];

[filter addTarget:blendFilter];
[uiElementInput addTarget:blendFilter];
[blendFilter addTarget:filterView];
[overlay addTarget:filterView];

__unsafe_unretained GPUImageUIElement *weakUIElementInput = uiElementInput;

[filter setFrameProcessingCompletionBlock:^(GPUImageOutput *filter, CMTime frameTime) {
     [weakUIElementInput update];
 }];

[blendFilter addTarget:movieWriter];

最佳答案

您的问题是您在设置方法中将overlay的输入图片定义为局部变量。您没有牢牢引用它,因此在完成此方法后立即将其重新分配,这还将从处理管道中删除图像纹理及其输出。

如果要保留输入图像,则需要将overlay设置为该类的实例变量,就像上面为照相机或电影输入所做的一样。然后它将继续被框架用作输入。

10-07 17:02