原因:为了实现yuv的播放故使用到了OpenGLES,在此介绍一下使用流程
概况:使用着色器程序将yuv转换为RGB,然后利用Renderer渲染器将数据渲染到GLSufraceView上,故我们需要实现着色器程序,渲染器,渲染视图。
首先视图创建伪代码如下:首先设置OpengGL的使用版本,然后设置一个渲染Renderer,此时的渲染Renderer就是我们自己实现的模块,紧接着设置渲染模式,如果为WHEN_DIRTY则只有每次主动调用请求渲染才会触发onDrawFrame方法实现同步调用,否则则是一种被动调用。
import android.opengl.GLSurfaceView;
public class GLSurface extends GLSurfaceView {
public GLSurface(Context context, AttributeSet attrs) {
super(context, attrs);
setEGLContextClientVersion(2);//设置使用的OpengGl版本.
render = new Render(context,this);
setRenderer(render);//设置Renderer
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);//需要手动调用requesetRender触发onDrawFrame方法
}
}
接下来实现Renderer伪代码如下:可以看出实现接口具有三个方法需要实现,该三个方法都是回调函数,第一个当surface被创建成功时调用,第二个当surface被调整时调用,第三个为绘制当前帧,所以在绘制前我们需要准备好着色器程序,纹理设置,数据缓存地址的申请等
public class Render implements GLSurfaceView.Renderer {
void onSurfaceCreated(GL10