android image 转yuv_Android 基于MediaCodec开发抖音短视频录制 ①

前言

当一个Android开发者玩抖音玩疯了之后,就会绞尽脑汁思考自己是否也能开发出一款相同的APP来呢?

滴,滴滴!

721817e7fcf7b0dd736b7b90332e0aea.png

本篇文章将介绍自己总结的短视频录制的相关内容,主要分为三个部分:

  • 摄像头内容录制
  • 音频录制
  • 视频合成

先上效果图

  • 录制过程
format,png
  • 录制结果
format,png

1.摄像头内容录制

19bb0ae778315ee1886bb49cffec6e95.png

录制流程大致如上图所示。

渲染关键代码

新建外部纹理

 @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { mTextureId = GLUtils.createTextureObject(GLES11Ext.GL_TEXTURE_EXTERNAL_OES); mSurfaceTexture = new SurfaceTexture(mTextureId); ... }

新建了外部纹理之后,传入 Camera

mCamera.setPreviewTexture(mSurfaceTexture);mCamera.startPreview();

GLSurfaceView 渲染时,请求 SurfaceTexture 更新,获取最新的内容

 @Override public void onDrawFrame(GL10 gl) { if (mFilter == null) { return; } float matrix[] = new float[16]; if (mSurfaceTexture != null) { //请求刷新最新内容 mSurfaceTexture.updateTexImage(); } mSurfaceTexture.getTransformMatrix(matrix);  if (mFrameListener != null) { //通知MediaCodec刷新画面 mFrameListener.onFrameAvailable(new VideoFrameData(mFilter, matrix, mSurfaceTexture.getTimestamp(), mTextureId)); } mFilter.init(); if (mOldFilter != null) { mOldFilter.release(); mOldFilter = null; } mSurfaceTexture.getTransformMatrix(mMatrix); //绘制预览内容 mFilter.draw(mTextureId, mMatrix); }

mFilter 中包含 OpenGL 相关的着色器程序

着色器代码如下:

 /** * 默认代码 */ private static final String FRAGMENT_CODE = "#extension GL_OES_EGL_image_external : require" + "precision mediump float;" + "varying vec2 vTextureCoord;" + "uniform samplerExternalOES uTexture;" + "void main() {" + " gl_FragColor = texture2D(uTexture, vTextureCoord);" + "}"; /** * 默认代码 */ private static final String VERTEX_CODE = "uniform mat4 uTexMatrix;" + "attribute vec2 aPosition;" + "attribute vec4 aTextureCoord;" + "varying vec2 vTextureCoord;" + "void main() {" + " gl_Position = vec4(aPosition,0.0,1.0);" + " vTextureCoord = (uTexMatrix * aTextureCoord).xy;" &#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值