通过GLSurfaceView修改和更新相机框架

时间:2015-07-11 16:07:35

标签: android opengl-es android-camera glsurfaceview

我正在使用GLSurfaceView活动在Android设备上显示相机框架。因为我是OpenGl Es中的新手,我想知道如何获取图像缓冲区并对其进行修改,然后在手机上显示修改后的帧?

在我的实现GLSurfaceView.Renderer的Renderer类中,我调用了一个本机函数:

public class Renderer implements GLSurfaceView.Renderer {
  public void onDrawFrame(GL10 gl) {
    MyJNINative.render();
  }
...
}

我正在使用的API提供了一种connectCallBack方法,可以通过onFrameAvailableNow之类的方式访问图像缓冲区。 所以我已经有了const类型的图像缓冲区。所以我对它的修改不会得到反映。

现在我的问题是如何添加一些gl方法来修改可以在显示器上反映的图像缓冲区?

我的原生渲染器:

Java_com_project_MyJNINative_render(
        JNIEnv*, jobject) {
    // Let's say I have image buffer here called "uint_8t* buffer"
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

    glViewport(0, 0, width, height);

    // UpdateTexture() 
    api_handler.UpdateTexture());
    gl_vid_obj->Render(glm::mat4(1.0f), glm::mat4(1.0f));    
    /// I NEED SOME CODE HERE TO set gl buffer
}

1 个答案:

答案 0 :(得分:0)

fadden所述,您无法更改连接到SurfaceTexture的预览缓冲区。但是可以获取onPreviewFrame()的预览缓冲区,修改它并通过glTexSubImage2D()将结果推送到OpenGL。有两个陷阱:你应该隐藏实际的预览(可能将它连接到GL表面上看不到的纹理),你应该足够快地进行所有处理(至少为#34;预览&## 20 FPS) 34;看起来很自然)。