主要变量
WindowSurface mDisplaySurface //对Surface的包装
WindowSurface mEncoderSurface
渲染器: FullFrameRect -->
1.初始化
1.1 初始化Camera
1.2 在SurfaceView.surfaceCreate()
1.2.1 初始化OpenGL ES 2.0
根据 mEGLDisplay , EGLContext 这2个变量初始化 EglCore
1.2.2 将Surface和OpenGL ES 2.0绑定
调用 EGL14.eglCreateWindowSurface(surface) 绑定
EGL14.eglCreateWindowSurface(surface) 封装在 EglCore
surface = SurfaceView.Holder.surface
最终创建出 WindowSurface mDisplaySurface
1.2.3 创建渲染器
初始化 片元着色气 , 顶点着色气 和 着色器运行时所需的变量名 ---> 生成mFullFrameBlit
mFullFrameBlit 保有每帧绘制时所需的变量
mFullFrameBlit 可以生成一个纹理ID
1.2.3 生成一个Texture
SurfaceTexture mCameraTexture = mFullFrameBlit.createTextureObject --->
1.2.4 添加 帧更新监听器(onFrameAvailable)
1.2.5 将Camera和Texture绑定
Camera.setPreviewTexture(mCameraTexture)
1.2.6 打开Camera,此时onFrameAvailable就会被循环调用
2.帧的更新过程(onFrameAvailable的调用)
2.1 更新SurfaceView
抓住camera的下一帧
把这一帧更新到SurfaceView
首先我们吧这个Surface打住,以便可以进行读写操作。
当 mCameraTexture.updateTexImage() ,从Camera中获取数据更新到Texture
OpenGL ES 2.0 的渲染器,根据这个TextureID做渲染
完了以后将OpenGl ES 2.0 中的数据移到Surface中 EGL14.eglSwapBuffers(mEGLDisplay, eglSurface)
2.2 录像输出到MediaCodec.Surface
大致流程跟
首先我们吧这个Surface打住,以便可以进行读写操作。
这里注意:我们不需要调用updateTexImage()
OpenGL ES 2.0 的渲染器,根据这个TextureID做渲染
交给MideaCodec做编码(这是一个异步操作)
添加一个时间轴
完了以后将OpenGl ES 2.0 中的数据移到Surface中
3.开始拍摄
3.1 初始化MediaCodec
3.2 将Surface和OpenGL ES 2.0绑定
1.2.2 Surface = MediaCodec.getInputSurface()
3.2 打开拍摄标记为,用以判断是否执行2.2
4.结束拍摄
4.1 MediaCode.stop()