RyanRq 2017-03-07 08:49 采纳率: 0%
浏览 2246
已结题

android OPENGLES 截屏显示问题

先上代码
public class MainActivity extends AppCompatActivity implements GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener {
private MediaProjectionManager mediaProjectionManager;
private GLSurfaceView surfaceview;
private LinearLayout linearLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearLayout = ((LinearLayout) findViewById(R.id.linearlayout));
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);

}


/**
 * 初始化摄像头
 */
private void initCamera() {
    surfaceview = new GLSurfaceView(this);
    linearLayout.addView(surfaceview);
    surfaceview.setEGLContextClientVersion(2);
    surfaceview.setRenderer(this);
}


private MediaProjection mediaProjection;

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
    startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);
    initCamera();
}


@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    setupGraphics();
    setupVertexBuffer();
    setupTexture();

//
}

private int width=1080;
private int height=1920;
private MediaPlayer mediaPlayer;
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    this.width = width;
    this.height = height;

// if (mediaPlayer == null) {
// mediaPlayer = new MediaPlayer();
// mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
// @Override
// public void onPrepared(MediaPlayer mp) {
// mp.start();
// }
// });
// Surface surface = new Surface(videoTexture);
// mediaPlayer.setSurface(surface);
// surface.release();
// try {
// mediaPlayer.setDataSource(Environment.getExternalStorageDirectory().getAbsolutePath()+"/1.mp4");
// mediaPlayer.prepareAsync();
// } catch (IOException e) {
// e.printStackTrace();
// }
// } else {
// mediaPlayer.start();
// }
Surface surface = new Surface(videoTexture);
VirtualDisplay display = mediaProjection.createVirtualDisplay("aa", 1080, 1920, 32,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, surface, null, null);
}

private float[] videoTextureTransform = new float[16];

@Override
public void onDrawFrame(GL10 gl) {
    synchronized (this) {
        if (frameAvailable) {
            videoTexture.updateTexImage();
            videoTexture.getTransformMatrix(videoTextureTransform);
            frameAvailable = false;
        }
    }
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);

// GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, textures[0]);
// Draw a rectangle and render the video frame as a texture on it.
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
// GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

// GLES20.glViewport(0, 0, width, height);
this.drawTexture();
}

private int shaderProgram;
int textureParamHandle;
int textureCoordinateHandle;
int positionHandle;
int textureTranformHandle;
private static short drawOrder[] = {0, 1, 2, 0, 2, 3};
private FloatBuffer vertexBuffer;
private ShortBuffer drawListBuffer;
private static float squareSize = 0.5f;
private static float squareCoords[] = {
        -squareSize, squareSize,   // top left
        -squareSize, -squareSize,   // bottom left
        squareSize, -squareSize,    // bottom right
        squareSize, squareSize}; // top right
private FloatBuffer textureBuffer;
private float textureCoords[] = {
        0.0f, 1.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 0.0f, 1.0f,
        1.0f, 1.0f, 0.0f, 1.0f};
private int[] textures = new int[1];
private SurfaceTexture videoTexture;

private void setupGraphics() {

    final String vertexShader = RawResourceReader.readTextFileFromRawResource(this, R.raw.vetext_sharder);
    final String fragmentShader = RawResourceReader.readTextFileFromRawResource(this, R.raw.fragment_sharder);

    final int vertexShaderHandle = ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER, vertexShader);
    final int fragmentShaderHandle = ShaderHelper.compileShader(GLES20.GL_FRAGMENT_SHADER, fragmentShader);
    shaderProgram = ShaderHelper.createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle,
            new String[]{"texture", "vPosition", "vTexCoordinate", "textureTransform"});

    GLES20.glUseProgram(shaderProgram);
    textureParamHandle = GLES20.glGetUniformLocation(shaderProgram, "texture");
    textureCoordinateHandle = GLES20.glGetAttribLocation(shaderProgram, "vTexCoordinate");
    positionHandle = GLES20.glGetAttribLocation(shaderProgram, "vPosition");
    textureTranformHandle = GLES20.glGetUniformLocation(shaderProgram, "textureTransform");
}

private void setupVertexBuffer() {
    // Draw list buffer
    ByteBuffer dlb = ByteBuffer.allocateDirect(drawOrder.length * 2);
    dlb.order(ByteOrder.nativeOrder());
    drawListBuffer = dlb.asShortBuffer();
    drawListBuffer.put(drawOrder);
    drawListBuffer.position(0);

    // Initialize the texture holder
    ByteBuffer bb = ByteBuffer.allocateDirect(squareCoords.length * 4);
    bb.order(ByteOrder.nativeOrder());

    vertexBuffer = bb.asFloatBuffer();
    vertexBuffer.put(squareCoords);
    vertexBuffer.position(0);
}

private void setupTexture() {
    ByteBuffer texturebb = ByteBuffer.allocateDirect(textureCoords.length * 4);
    texturebb.order(ByteOrder.nativeOrder());

    textureBuffer = texturebb.asFloatBuffer();
    textureBuffer.put(textureCoords);
    textureBuffer.position(0);

    // Generate the actual texture
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glGenTextures(1, textures, 0);

// checkGlError("Texture generate");

    GLES20.glBindTexture(GLES20.GL_TEXTURE_BINDING_2D, textures[0]);
    GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER,
            GLES20.GL_NEAREST);
    GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER,
            GLES20.GL_LINEAR);

// checkGlError("Texture bind");

    videoTexture = new SurfaceTexture(textures[0]);
    videoTexture.setOnFrameAvailableListener(this);
}

private boolean frameAvailable = false;

@Override
public void onFrameAvailable(SurfaceTexture surfaceTexture) {
    synchronized (this) {
        Log.e("---", "onFrameAvailable: ");
        frameAvailable = true;
    }
}

private void drawTexture() {
    // Draw texture

    GLES20.glEnableVertexAttribArray(positionHandle);
    GLES20.glVertexAttribPointer(positionHandle, 2, GLES20.GL_FLOAT, false, 0, vertexBuffer);


    GLES20.glEnableVertexAttribArray(textureCoordinateHandle);
    GLES20.glVertexAttribPointer(textureCoordinateHandle, 4, GLES20.GL_FLOAT, false, 0, textureBuffer);

    GLES20.glUniformMatrix4fv(textureTranformHandle, 1, false, videoTextureTransform, 0);

    GLES20.glDrawElements(GLES20.GL_TRIANGLES, drawOrder.length, GLES20.GL_UNSIGNED_SHORT, drawListBuffer);
}

}
fragment_shader
#extension GL_OES_EGL_image_external : require
precision mediump float;
uniform samplerExternalOES texture;
varying vec2 v_TexCoordinate;

void main () {
vec4 color = texture2D(texture, v_TexCoordinate);
gl_FragColor = color;
}
vetext_shader
attribute vec4 vPosition;
attribute vec4 vTexCoordinate;
uniform mat4 textureTransform;
varying vec2 v_TexCoordinate;

void main () {
v_TexCoordinate = (textureTransform * vTexCoordinate).xy;
gl_Position = vPosition;
}

视频可以播放,截屏就无法正常显示了,不知道为何求大神指教图片说明

  • 写回答

1条回答 默认 最新

  • devmiao 2017-03-07 15:49
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog