# android_vip_opengl_fbo_mediacodec **Repository Path**: jsjxsy/android_vip_opengl_fbo_mediacodec ## Basic Information - **Project Name**: android_vip_opengl_fbo_mediacodec - **Description**: Android vip opengl 课程,camerax+opengl+fbo+mediacodec 摄像头的数据通过opengl渲染后,通过mediacodec录制到本地 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-12-03 - **Last Updated**: 2024-12-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: Android, Opengl, vip, media ## README 1 离屏缓冲区FBO FBO(相当于数据)--->(绑定)texture纹理--》(绑定)图层 创建图层 GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D,0,GLES20.GL_RGBA,width,height, 0,GLES20.GL_RGBA,GLES20.GL_UNSIGNED_BYTE, null); 自己创建egl环境EGLBase 交换 mEglDisplay:虚拟屏幕, mEglSurface:eglSurface数据 EGL14.eglSwapBuffers(mEglDisplay, mEglSurface); 拿到CameraRender中opengl的一个上下文 EGLContext eglContext = EGL14.eglGetCurrentContext(); 传给EGLBase 也就是将GLSurfaceView的上下文传给新建的ELGBase作为上下文 GLSurfaceView中进行 int id = cameraFilter.onDraw(textures[0]); // id 1 textures[0] 2 mScreenFilter.onDraw(id); 在ELGBase中也要 mScreenFilter.onDraw(textureId); 必须在EGLBase的上下文的线程中进行 mHandler.post(new Runnable() { @Override public void run() { mEglBase.draw(textureId, timestamp); //从编码器的输出缓冲区获取编码后的数据就ok了 getCodec(false); } }); CameraFilter //因为这一层是摄像头后的第一层,所以需要使用扩展的 GL_TEXTURE_EXTERNAL_OES,这个针对外部设备 GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureId); //ScreenFilter 采用纹理坐标和CameraFilter采用的纹理坐标是一样的, ScreenFilter 还是外部纹理经过CPU Camerax --》 FBO(CameraFilter,不能显示到屏幕上,FBO的纹理Id) --> ScreenFilter(显示到屏幕上) EGL -----》 需要的是FBO的纹理Id,获取FBO的数据---》 ScreenFilter(不会显示到屏幕上) //不使用了 设值完了 方便 GLES20.glBindFramebuffer //必须解绑,不能重新绑定新的FBO GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,0); GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,0); camera 如何与opengl的纹理绑定 1. opengl 创建纹理 绑定到camera的通过addTarget绑定 2. camera 获取SurfaceTexture 通过 mCameraTexure.attachToGLContext(textures[0]);创建纹理给opengl