用黑色矩形清洁 SurfaceTexture
Clean SurfaceTexture with black rect
我正在使用 Exoplayer 和 GL SurfaceTexture(来自 TextureView)来显示视频。我在视频播放中重复使用相同的表面。
我释放播放器并实例化一个新播放器。第二次显示 SurfaceTexture 时,它显示上一个视频的旧 Texture,直到播放器开始播放并用黑色填充 Surface。
我正在寻找一种方法来绘制一个黑色矩形以用黑色填充表面,但无法实现。
我不熟悉 Exoplayer,但我怀疑您的选项与 中列出的使用 MediaPlayer 播放的选项相同。
总结:
- 您可以附加 GLES、清除 Surface、分离 GLES (Grafika does this)。
- 您可以创建一个单帧黑色视频并播放它。
- 您可以创建第二个覆盖第一个的空视图。播放视频时隐藏,播放结束时显示。
你不能做的是附加一个 Canvas 然后清除它,因为一旦附加了 Canvas 它就永远不会松开。
请致电
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
绘制新帧之前
在 Grafika 上使用@fadden link,我制作了自己的脚本来清理表面。它兼容 API 16。
/**
* Clear the given surface Texture by attaching a GL context and clearing the surface.
* @param texture a valid SurfaceTexture
*/
private void clearSurface(SurfaceTexture texture) {
if(texture == null){
return;
}
EGL10 egl = (EGL10) EGLContext.getEGL();
EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
egl.eglInitialize(display, null);
int[] attribList = {
EGL10.EGL_RED_SIZE, 8,
EGL10.EGL_GREEN_SIZE, 8,
EGL10.EGL_BLUE_SIZE, 8,
EGL10.EGL_ALPHA_SIZE, 8,
EGL10.EGL_RENDERABLE_TYPE, EGL10.EGL_WINDOW_BIT,
EGL10.EGL_NONE, 0, // placeholder for recordable [@-3]
EGL10.EGL_NONE
};
EGLConfig[] configs = new EGLConfig[1];
int[] numConfigs = new int[1];
egl.eglChooseConfig(display, attribList, configs, configs.length, numConfigs);
EGLConfig config = configs[0];
EGLContext context = egl.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT, new int[]{
12440, 2,
EGL10.EGL_NONE
});
EGLSurface eglSurface = egl.eglCreateWindowSurface(display, config, texture,
new int[]{
EGL10.EGL_NONE
});
egl.eglMakeCurrent(display, eglSurface, eglSurface, context);
GLES20.glClearColor(0, 0, 0, 1);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
egl.eglSwapBuffers(display, eglSurface);
egl.eglDestroySurface(display, eglSurface);
egl.eglMakeCurrent(display, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_CONTEXT);
egl.eglDestroyContext(display, context);
egl.eglTerminate(display);
}
我正在使用 Exoplayer 和 GL SurfaceTexture(来自 TextureView)来显示视频。我在视频播放中重复使用相同的表面。
我释放播放器并实例化一个新播放器。第二次显示 SurfaceTexture 时,它显示上一个视频的旧 Texture,直到播放器开始播放并用黑色填充 Surface。
我正在寻找一种方法来绘制一个黑色矩形以用黑色填充表面,但无法实现。
我不熟悉 Exoplayer,但我怀疑您的选项与
总结:
- 您可以附加 GLES、清除 Surface、分离 GLES (Grafika does this)。
- 您可以创建一个单帧黑色视频并播放它。
- 您可以创建第二个覆盖第一个的空视图。播放视频时隐藏,播放结束时显示。
你不能做的是附加一个 Canvas 然后清除它,因为一旦附加了 Canvas 它就永远不会松开。
请致电
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
绘制新帧之前
在 Grafika 上使用@fadden link,我制作了自己的脚本来清理表面。它兼容 API 16。
/**
* Clear the given surface Texture by attaching a GL context and clearing the surface.
* @param texture a valid SurfaceTexture
*/
private void clearSurface(SurfaceTexture texture) {
if(texture == null){
return;
}
EGL10 egl = (EGL10) EGLContext.getEGL();
EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
egl.eglInitialize(display, null);
int[] attribList = {
EGL10.EGL_RED_SIZE, 8,
EGL10.EGL_GREEN_SIZE, 8,
EGL10.EGL_BLUE_SIZE, 8,
EGL10.EGL_ALPHA_SIZE, 8,
EGL10.EGL_RENDERABLE_TYPE, EGL10.EGL_WINDOW_BIT,
EGL10.EGL_NONE, 0, // placeholder for recordable [@-3]
EGL10.EGL_NONE
};
EGLConfig[] configs = new EGLConfig[1];
int[] numConfigs = new int[1];
egl.eglChooseConfig(display, attribList, configs, configs.length, numConfigs);
EGLConfig config = configs[0];
EGLContext context = egl.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT, new int[]{
12440, 2,
EGL10.EGL_NONE
});
EGLSurface eglSurface = egl.eglCreateWindowSurface(display, config, texture,
new int[]{
EGL10.EGL_NONE
});
egl.eglMakeCurrent(display, eglSurface, eglSurface, context);
GLES20.glClearColor(0, 0, 0, 1);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
egl.eglSwapBuffers(display, eglSurface);
egl.eglDestroySurface(display, eglSurface);
egl.eglMakeCurrent(display, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_CONTEXT);
egl.eglDestroyContext(display, context);
egl.eglTerminate(display);
}