用于2个视图的相同SurfaceTexture

问题描述 投票:0回答:2

是否可以对2个视图使用相同的表面纹理?如果是这样,怎么办?我使用mediaplayer播放视频,并且希望同时在2个不同的视图上播放同一视频。

我尝试创建SurfaceTexture,然后将此表面纹理设置为两个视图,但是不起作用。

   public int createTextureObject() {
        int[] textures = new int[1];
        GLES20.glGenTextures(1, textures, 0);

        int texId = textures[0];
        GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, texId);

        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);
        GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S,
                GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T,
                GLES20.GL_CLAMP_TO_EDGE);

        return texId;
    }

SurfaceTexture st = new SurfaceTexture(createTextureObject());
textureView1.setSurfaceTexture(st);
textureView2.setSurfaceTexture(st); 
mMediaPlayer.setSurface(new Surface(st));

它随机作用于一个或另一个视图,但不能同时作用于两个视图。

android android-mediaplayer android-textureview
2个回答
0
投票

我不认为TextureView支持共享的SurfaceTexture。我不知道有什么可以阻止它发生的,但是onFrameAvailable()回调只能通知一个对象。

((您可能可以评审从第一个实例在第二个实例中手动调用回调的地方,但这似乎很麻烦。)

一种可行的方法是像现在一样创建SurfaceTexture,并将视频帧发送给它,但是提供一个onFrameAvailable()侦听器,该侦听器使用OpenGL ES将视频帧渲染到两个TextureViews。

[各种示例可以在Grafika中找到,例如“连续捕获”在SurfaceTexture上接收“摄像机”输入,然后将其渲染两次(一次到显示器,一次到视频编码器)。


-1
投票

我想知道解决方案,请告诉我您的问题是否已解决

© www.soinside.com 2019 - 2024. All rights reserved.