OpenGL ES渲染YUV纹理(2)

电脑杂谈  发布时间:2019-12-24 17:02:46  来源:网络整理

实现JfGLSurfaceView

package com.example.myplayer.opengl;
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.util.AttributeSet;
public class JfGLSurfaceView extends GLSurfaceView {
    private JfRender jfRender;
    public JfGLSurfaceView(Context context) {
        this(context,null);
    }
    public JfGLSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setEGLContextClientVersion(2);
        jfRender = new JfRender(context);
        setRenderer(jfRender);
        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);//requestRender()时不会重复渲染
    }
    public void setYUVData(int width,int height,byte[] y,byte[] u,byte[] v){
        if (jfRender != null) {
            jfRender.setYUVRenderData(width, height, y, u, v);
            requestRender();
        }
    }
}

JfPlayer.java中调用

java 视频播放服务器_万能播放器java版_mac版万能解锁器wifi下载

private JfGLSurfaceView jfGLSurfaceView;
public void setJfGLSurfaceView(JfGLSurfaceView jfGLSurfaceView) {
    this.jfGLSurfaceView = jfGLSurfaceView;
}
/**
 *
 * @param width
 * @param height
 * @param y
 * @param u
 * @param v
 */
public void onCallRenderYUV(int width,int height,byte[] y,byte[] u,byte[] v){
    JfLog.d("获取到视频的数据");
    if (jfGLSurfaceView != null) {
        jfGLSurfaceView.setYUVData(width, height, y, u, v);
    }
}

MainActivity中设置WlGLSurfaceView:

private WlGLSurfaceView wlGLSurfaceView;
jfGLSurfaceView = (JfGLSurfaceView) findViewById(R.id.jfglsfv);
jfPlayer.setJfGLSurfaceView(jfGLSurfaceView);

因为在JfRender.java中的private void renderYUV()方法中有一个判断语句,

if(width_yuv > 0 && height_yuv > 0 && y != null && u != null && v != null){}

有也许视频中的那些AVFrame可能不满足某些条件,比如y、u、v数据某一个为空,

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);

mac版万能解锁器wifi下载_万能播放器java版_java 视频播放服务器

导致这句不执行万能播放器java版,所以没有画上去矩形;

@Override
public void onDrawFrame(GL10 gl) {
    //用黑色清屏
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    renderYUV();
}

在onDrawFrame回调方法中就用红色清了一次屏,所以会闪黑屏!

如果改为

@Override
public void onDrawFrame(GL10 gl) {
    //用黑色清屏
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    GLES20.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
    renderYUV();
}

会很明显的闪红屏!

解决方法:

不管有没有渲染都把矩形画上去!


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-134507-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 谷崎一郎
      谷崎一郎

      够早的啊

    • 王林洋
      王林洋

      司机坐在左边开车艾玛英国拍摄鉴定完毕

    热点图片
    拼命载入中...