Android OpenGL+Camera2渲染(1) —— OpenGL简单介绍
Android OpenGL+Camera2渲染(2) —— OpenGL实现Camera2图像预览
Android OpenGL+Camera2渲染(3) —— 大眼,贴纸功能实现
Android OpenGL+Camera2渲染(4) —— 美颜功能实现
Android OpenGL+Camera2渲染(5) —— 录制视频,实现快录慢录
这篇文章是在前面几篇的基础上实现的,把美颜,大眼,贴纸的效果,使用MediaCodec编码后录制成视频,支持快录和慢录的功能。
首先 我们进过处理之后的数据是存在纹理当中的,而MediaCodec 编码的输入队列支持把surface作为输入源,那么这两者如何关联呢? 方案是这样的。 自己配置一个EGL环境,把这个EGL环境中的EGLSurface和mediacodec的surface绑定,把当前的EGL环境和我们处理美颜滤镜的EGL绑定,这样就可以在当前的EGL环境中操作美颜滤镜的EGL环境中的纹理了。然后把数据输出的MediaCodec的surface中。
在开始录制的时候,取初始化编码器MediaCodec、MediaMuxer 和 配置EGL环境进行绑定。
public void start(float speed, String savePath) {
mSavePath = savePath;
mSpeed = speed;
try {
MediaFormat mediaFormat = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, mWidth, mHeight);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, mWidth * mHeight * fps / 5);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, fps);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, fps);
mediaCodec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
inputSurface = mediaCodec.createInputSurface();
mediaMuxer = new MediaMuxer(mSavePath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
//-------------配置EGL环境----------------
HandlerThread handlerThread = new HandlerThread("elgCodec");
handlerThread.start();
mHandler = new Handler(handlerThread.getLooper());
mHandler.post(new Runnable() {
@Override
public void run() {
eglConfigBase = new EglConfigB