0

是否可以对 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));

它在一个或另一个视图上随机工作,但不能同时在两个视图上工作。

4

1 回答 1

0

我不相信 TextureView 支持共享的 SurfaceTextures。我不知道有什么会阻止它成为可能,但onFrameAvailable()回调只能通知一个对象。

(您也许可以在第二个实例中从第一个实例中手动调用回调的地方进行陪审,但这似乎是在自找麻烦。)

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

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

于 2015-11-19T23:59:29.270 回答