硬编这块网上的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的消息线程。