android视频录制与滤镜(三):grafika——Show + capture camera

 

硬编这块网上的demo比硬解明显少了很多,但还好。认识几个做视频编辑方面的朋友都不约而同的向我推荐了google的grafika项目。仔细看了看,发现grafika里面能用的好东西有不少,如果能够把项目中一些比较精华的部分啃下来,对于视频编辑,对于opengl的操作都会有很大的益处。
言归正传,我们需要的是视频录制与滤镜功能,找了一下“show + capture camera"这个部分的内容正好合适,而且还找到一个国人的开源项目VideoEditor-For-Android也正是基于这一部分做的封装。所以觉得花点时间好好理解下这部分内容。“Record GL app”应该会是下一个需要整理的。

 

CameraCaptureActivity重点分析理解其编码录制过程。

    static final int FILTER_NONE = 0;
    static final int FILTER_BLACK_WHITE = 1;
    static final int FILTER_BLUR = 2;
    static final int FILTER_SHARPEN = 3;
    static final int FILTER_EDGE_DETECT = 4;
    static final int FILTER_EMBOSS = 5;

    private GLSurfaceView mGLView;
    private CameraSurfaceRenderer mRenderer;
    private Camera mCamera;
    private CameraHandler mCameraHandler;
    private boolean mRecordingEnabled;      // controls button state

    private int mCameraPreviewWidth, mCameraPreviewHeight;

    // this is static so it survives activity restarts
    private static TextureMovieEncoder sVideoEncoder = new TextureMovieEncoder();

从变量区来看,该类支持多种滤镜效果,使用经典的Camera+GLSurfaceView方式实现预览。录制部分应该是Camera回调后使用TextureMoviewEncoder来实现编码。

 

TextureMovieEncoder这货这么显眼,一看就是主角,为了节约时间不如就直接从他入手,以达到分析编码录制过程的目的。

 

TextureMovieEncoder的初始化以及调用

private static TextureMovieEncoder sVideoEncoder = new TextureMovieEncoder();

饿汉式静态变量的初始化

mRecordingEnabled = sVideoEncoder.isRecording();
mRenderer = new CameraSurfaceRenderer(mCameraHandler, sVideoEncoder, outputFile);

 

activity中主要是这两处调用,看来重点应该是传入了CameraSurfaceRenderer。
在CameraSurfaceRenderer中,传入的TextureMoviewEncoder被赋值给了变量mVideoEncoder。mVideoEncoder除了在onSurfaceCreated方法中初始化了一个mRecordingEnabled变量外,其余调用都在onDrawFrame中。

 

使用到5个api:

mVideoEncoder.startRecording(new TextureMovieEncoder.EncoderConfig(
                            mOutputFile, mOutWidth, mOutHeight, mBitRate, EGL14.eglGetCurrentContext()))

当需要录制且录制状态为RECORDING_OFF时会调用该方法来开始一段新的录制。使用EncoderConfig来初始化一段录制的输出文件/宽高/码率等参数,最后一个EGL14.glGetCurrentContext()应该是opengl的当前上下文。主要用于在构造EglCore时可以依据不同的gles版本来创建EGLContext对象。startRecording方法中只做了一件事就是启动了一条EncodeHandler的消息线程。

 

 

 

 

 

 

你可能感兴趣的:(android视频录制与滤镜)