Android之grafika源码阅读

本文主要记录阅读源码的部分心得

源码地址 : https://github.com/google/grafika

我的:https://github.com/CL-window/openGL_learn.git 

这个代码虽然有一段时间了,但是其中的关于相机部分 还是很值得看一下的

1. mp4播放:PlayMovieActivity TextureView
     PlayMovieSurfaceActivity in SurfaceView
MediaExtractor 分解音视频
MediaCodec 播放,需要设置输出的 Surface
decoder.configure(format, mOutputSurface, null, 0);
// 对输入的数据流进行编码或者解码处理
decoder.dequeueInputBuffer // 获得这个用来作为媒体文件源码的ByteBuffer(从输入的buffers的数组中)的索引位置
decoder.queueInputBuffer // 使用带有媒体文件源码的ByteBuffer之后,通过调用此方法来释放缓存区的所有权
decoder.dequeueOutputBuffer // 获得你接收到结果的ByteBuffer的索引位置
decoder.releaseOutputBuffer // 释放所有权
1.1 需要在 UI线程执行的代码 可以 通过 Handler.sendMessage 实现

// Send message through Handler so it runs on the right thread.
    mLocalHandler.sendMessage(mLocalHandler.obtainMessage(MSG_PLAY_STOPPED, mFeedback));
    private static class LocalHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            int what = msg.what;

            switch (what) {
                case MSG_PLAY_STOPPED:
                    PlayerFeedback fb = (PlayerFeedback) msg.obj;
                    fb.playbackStopped();
                    break;
                default:
                    throw new RuntimeException("Unknown msg " + what);
            }
        }
    }

2. ContinuousCaptureActivity
录制出来的 方向不对, 解决 :mEncoderSurface.makeCurrentReadFrom(mDisplaySurface);
即使用预览的画面录制
预览的方向 camera.setDisplayOrientation (适配2.2之上的手机)
parameters.set("orientation", "portrait")或者parameters.setRotation(90) (适配下2.2以下)

surfaceCreated 里
预览显示使用的和 录制视频 使用的是相同的 EGLContext ,封装在 EglCore 里,同时还封装了(EGLDisplay,EGLConfig)
WindowSurface 封装 EGLSurface

设置相机预览,使用 mCameraTexture.setOnFrameAvailableListener 监听回调
Camera.setPreviewTexture
Camera.startPreview()
在有一帧数据到达时,先调用
EGL14.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext)
通知GPU以及OPENGL ES在执行绘图指令的时候,是在当前mEGLContext这个上下文绘制在mEGLSurface上的
这样绘制就绘制在我们的布局SurfaceView 上
updateTexImage() // 更新纹理图像为从图像流中提取的最近一帧
getTransformMatrix(float[] mtx) // 提取最近调用的updateTexImage()为纹理图像设置的4×4的纹理坐标变换矩阵

预览 mDisplaySurface 和 录制mEncoderSurface 使用 不同 Surface, 但是共用EGLContext,还有一个mCameraTexture 真正获取相机的返回数据
录制的 MediaCodec createInputSurface ,和 录制mEncoderSurface 共用一个 Surface,这样就保证录制进去的是相机返回的数据

#camera 默认是横屏 ,所以 width 为竖屏时的高,height为竖屏时的宽

3. TextureFromCameraActivity
支持 缩放 大小 旋转 改变
主要是 Sprite2d 这个类 Matrix 提供的方法,通过 translateM ,rotateM,scaleM变化一个 4*4 的矩阵

这个类使用的是Matrix

float[] modelView = mModelViewMatrix;
    Matrix.setIdentityM(modelView, 0);
    Matrix.translateM(modelView, 0, mPosX, mPosY, 0.0f);
    if (mAngle != 0.0f) {
        Matrix.rotateM(modelView, 0, mAngle, 0.0f, 0.0f, 1.0f);
    }
    Matrix.scaleM(modelView, 0, mScaleX, mScaleY, 1.0f);

后面就是通知 GL 绘制 grafika.gles.Sprite2d.draw(gles.FlatShadedProgram, float[])

4. CameraCaptureActivity
GLSurfaceView.queueEvent() 运行在GL线程
根据不同选择使用不同shader处理显示画面
CameraSurfaceRenderer.updateFilter 里处理
mFullScreen.changeProgram(new Texture2dProgram(programType));
Texture2dProgram.java里定义了shader,使用 不同 Program ,GLES20.glDeleteProgram


你可能感兴趣的:(Android,sample)