GPUImage的水印添加遇到的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shengpeng3344/article/details/84944765

Tried to overrelease a framebuffer, did you forget to call -useNextFrameForImageCapture before using -imageFromCurrentFramebuffer?

问题描述

在使用GPUImage添加水印时,使用GPUImageUIElement作为输入源,通过GPUImageAlphaBlendFilter使得GPUImageUIElement与GPUImageVideoCamera源混合达到水印效果,在调用

[self.uiElementInput update];//更新水印图片

方法时,会有如下断言
在这里插入图片描述

Tried to overrelease a framebuffer, did you forget to call -useNextFrameForImageCapture before using -imageFromCurrentFramebuffer?
这里意思为重复释放,也就是GPUImage记录的数值为负数了,这里有两种处理方式

1、在回调中update

 __weak typeof(self) _self = self;
    [self.filter setFrameProcessingCompletionBlock:^(GPUImageOutput *output, CMTime time) {
        [_self.uiElementInput update];
    }];

这样弊端是每次处理都会调用一次update,损耗性能,但如果水印是GIF图的话,正好采用这种方式

2、改写GPUImage源码

修改GPUImageUIElement中的

// TODO: This may not work
    outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:layerPixelSize textureOptions:self.outputTextureOptions onlyTexture:YES];
    [outputFramebuffer disableReferenceCounting]; // Add this line, because GPUImageTwoInputFilter.m frametime updatedMovieFrameOppositeStillImage is YES, but the secondbuffer not lock
    
    glBindTexture(GL_TEXTURE_2D, [outputFramebuffer texture]);
    // no need to use self.outputTextureOptions here, we always need these texture options
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)layerPixelSize.width, (int)layerPixelSize.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData);
    
    free(imageData);
    for (id<GPUImageInput> currentTarget in targets)
    {
        if (currentTarget != self.targetToIgnoreForUpdates)
        {
            NSInteger indexOfObject = [targets indexOfObject:currentTarget];
            NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue];
            
            [currentTarget setInputSize:layerPixelSize atIndex:textureIndexOfTarget];
            [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; // add this line, because the outputFramebuffer is update above
            [currentTarget newFrameReadyAtTime:frameTime atIndex:textureIndexOfTarget];
        }
    }

Add this line 注释的为修改的地方
根据使用的类不一样,可以自己修改试试

可以参考 https://github.com/BradLarson/GPUImage/issues/2211

猜你喜欢

转载自blog.csdn.net/shengpeng3344/article/details/84944765