GLSurfaceView渲染RGB的数据,利用双缓冲空间机制。取出缓冲地址,将要渲染的数据copy到缓冲地址.

获取Surface

 

Java部分:

SurfaceView控件设置到界面中显示

SurfaceView定义一个类来实现

package com.example.hello;

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.util.AttributeSet;
import android.view.SurfaceHolder;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

public class Xpaly extends GLSurfaceView implements Runnable, SurfaceHolder.Callback {

    public Xpaly(Context context , AttributeSet attrs) {
        super(context);
    }

    @Override
    public void run() {
      Open("/sdcard/Pictures/Rc.mp4",getHolder().getSurface());
    }
    @Override
    public void surfaceCreated(SurfaceHolder var1)
    {

    }
    @Override
    public void surfaceChanged(SurfaceHolder var1, int var2, int var3, int var4)
    {
      new Thread(this).start();
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder var1)
    {

    }

    public native void Open(String url_,Object surface);


}

实现SurfaceView Callback

 

 

需要android的库和头文件

#include <android/native_window.h>
#include <android/native_window_jni.h>

 

 

C++ 部分

    //显示窗口初始化
    ANativeWindow *nwin = ANativeWindow_fromSurface(env,surface);
    int outWidth=vc->width;
    int outHeight=vc->height;
    //设置native window的buffer大小,可自动拉伸
    ANativeWindow_setBuffersGeometry(nwin,outWidth,outHeight,WINDOW_FORMAT_RGBA_8888);
    ANativeWindow_Buffer wbuf;





     //锁定窗口,取出空间
     ANativeWindow_lock(nwin,&wbuf,0);
     //取缓冲区地址
     uint8_t *dst = (uint8_t*)wbuf.bits;
     //数据拷贝到缓冲区中
     memcpy(dst,rgb,outWidth*outHeight*4);
     //解锁窗口空间
     ANativeWindow_unlockAndPost(nwin);

 

 

 

 

 

 

 

 

 

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐