在项目raw下创建 fragment_mediacodec.glsl 用来渲染视频
#extension GL_OES_EGL_image_external : require
precision mediump float;
varying vec2 v_texPosition;
uniform samplerExternalOES sTexture;
void main() {
gl_FragColor=texture2D(sTexture, v_texPosition);
}
WlRender中的代码
package com.ywl5320.myplayer.opengl;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.opengl.GLES11Ext;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.view.Surface;
import com.ywl5320.myplayer.R;
import com.ywl5320.myplayer.log.MyLog;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
public class WlRender implements GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener {
public static final int RENDER_YUV = 1;
public static final int RENDER_MEDIACODEC = 2;
private Context mContext;
private int renderType = RENDER_YUV;
public void setRenderType(int renderType) {
this.renderType = renderType;
}
/*********************************** yuv ***********************************************/
//yuv
private int program_yuv;
private int avPosition_yuv;
private int afPosition_yuv;
private int sampler_y;
private int sampler_u;
private int sampler_v;
private int[] textureId_yuv;
private int width_yuv;
private int height_yuv;
private ByteBuffer y;
private ByteBuffer u;
private ByteBuffer v;
/*********************************** mediacodec-start ***********************************************/
//创建program
private int program_mediacodec;
private int avPosition_mediacodec;
private int afPosition_mediacodec;
//纹理id
private int samplerOES_mediacodec;
private int textureId_mediacodec;
private SurfaceTexture surfaceTexture;
private Surface surface;
private OnSurfaceCreateListener onSurfaceCreateListener;
private OnRenderListner onRenderListner;
public void setOnSurfaceCreateListener(OnSurfaceCreateListener onSurfaceCreateListener) {
this.onSurfaceCreateListener = onSurfaceCreateListener;
}
public void setOnRenderListner(OnRenderListner onRenderListner) {
this.onRenderListner = onRenderListner;
}
/*********************************** mediacodec-end ***********************************************/
//声明顶点坐标数组 绘制坐标范围
private final float[] vertexData = {
-1f, -1f,

该博客介绍了如何在Android中使用OpenGL ES进行视频渲染,包括从YUV数据手动渲染和使用MediaCodec进行硬件加速渲染。首先,展示了创建`fragment_mediacodec.glsl`着色器文件来处理MediaCodec提供的外部纹理。接着,详细解释了`WlRender`类的实现,包括初始化YUV和MediaCodec渲染,以及在`onFrameAvailable`回调中更新帧数据。最后,通过`WlGLSurfaceView`和`WlPlayer`类展示了如何设置和使用这些渲染组件。
最低0.47元/天 解锁文章
1730

被折叠的 条评论
为什么被折叠?



