2 个视图的相同 SurfaceTexture
same SurfaceTexture for 2 views
是否可以对两个视图使用相同的表面纹理?如果是这样,如何?
我使用 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));
它随机作用于一个或另一个视图,但不能同时作用于两个视图。
我认为 TextureView 不支持共享的 SurfaceTexture。我不知道有什么可以阻止它成为可能,但是 onFrameAvailable()
回调只能通知一个对象。
(您也许可以临时安排一些东西,在第一个实例中手动调用第二个实例中的回调,但这似乎是在自找麻烦。)
一种可行的方法是像您现在所做的那样创建 SurfaceTexture,并将视频帧发送给它,但提供一个 onFrameAvailable()
侦听器,使用 OpenGL ES 将视频帧渲染到两个 TextureView .
可以在 Grafika 中找到这方面的各种示例,例如"continuous capture" 在 SurfaceTexture 上接收相机输入,然后将其渲染两次(一次到显示器,一次到视频编码器)。
是否可以对两个视图使用相同的表面纹理?如果是这样,如何? 我使用 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));
它随机作用于一个或另一个视图,但不能同时作用于两个视图。
我认为 TextureView 不支持共享的 SurfaceTexture。我不知道有什么可以阻止它成为可能,但是 onFrameAvailable()
回调只能通知一个对象。
(您也许可以临时安排一些东西,在第一个实例中手动调用第二个实例中的回调,但这似乎是在自找麻烦。)
一种可行的方法是像您现在所做的那样创建 SurfaceTexture,并将视频帧发送给它,但提供一个 onFrameAvailable()
侦听器,使用 OpenGL ES 将视频帧渲染到两个 TextureView .
可以在 Grafika 中找到这方面的各种示例,例如"continuous capture" 在 SurfaceTexture 上接收相机输入,然后将其渲染两次(一次到显示器,一次到视频编码器)。