使用KxMovie和GPUImage冲突的问题

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

问题描述

项目中使用GPUImage进行摄像头采集,同时对软解后的数据使用OpenGL渲染,这里借鉴了KxMovie的逻辑代码,当两者同时操作时,使得GPUImage图像倒置90度,并出现闪屏,图片失真问题,这里分享下KxMovie的一些问题,另外GPUImage也有部分问题需要改进

1、KxMovie的渲染视图大小有时不准确

当切换全屏和小屏时,opengl渲染大小设置不正确,相关代码如下

- (void)layoutSubviews
{
    glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer);
    [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_backingWidth);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_backingHeight);
    
    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if (status != GL_FRAMEBUFFER_COMPLETE) {
        
        NSLog(@"failed to make complete framebuffer object %x", status);
        
    } else {
        
        NSLog(@"OK setup GL framebuffer %d:%d", _backingWidth, _backingHeight);
        NSLog(@"OK setup GL %@", NSStringFromCGRect(self.frame));
    }
    
    [self updateVertices];
    [self render: nil];
}

每次操作前都应该设置currentContext,故在代码前加一句

[EAGLContext setCurrentContext:_context];

可解决

2、KxMovie与GPUImage的layer重叠导致GPUImage的图片翻转90度

尽量保证不要在同一个UIView中初始化两个opengles layer就好,否则出现很多意想不到的问题

3、GPUImage预览视图闪烁问题

这个问题只有在创建KxMovie后,才会出现,具体原因也是释放opengl环境变量时currentContext没有设置,而GPUImage在自己的线程设置currentContext,多线程处理会导致上下文混乱

- (void)cleanRender
{
    if ([EAGLContext currentContext] != _context) { // add this line , to resolve shine
        [EAGLContext setCurrentContext:_context];
    }
    _renderer = nil;
    
    if (vertex_shader) {
        glDeleteShader(vertex_shader);
        vertex_shader = 0;
    }
    
    if (fragment_shader) {
        glDeleteShader(fragment_shader);
        fragment_shader = 0;
    }
    
    if (_framebuffer) {
        glDeleteFramebuffers(1, &_framebuffer);
        _framebuffer = 0;
    }
    
    if (_renderbuffer) {
        glDeleteRenderbuffers(1, &_renderbuffer);
        _renderbuffer = 0;
    }
    
    if (_program) {
        glDeleteProgram(_program);
        _program = 0;
    }
    
    glFinish(); // add this line , need finish
    
    if ([EAGLContext currentContext] == _context) {
        [EAGLContext setCurrentContext:nil];
    }
    _context = nil;
    
    
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillResignActiveNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
    
}

具体可以参考KxMovie源码比较
所有对于opengl变量元素的操作应该在设置上下文后,尽量保持线程一致

另外GPUImage也有水印问题 https://blog.csdn.net/shengpeng3344/article/details/84944765

猜你喜欢

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