版权声明:本文为博主原创文章,未经博主允许不得转载。 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 注释的为修改的地方
根据使用的类不一样,可以自己修改试试