使用黑色矩形清洁表面纹理

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

我正在使用 ExoplayerGL SurfaceTexture (来自TextureView)来显示视频。我在视频播放中重复使用相同的表面

我释放播放器并实例化一个新播放器。当第二次显示 SurfaceTexture 时,显示上一个视频中的旧纹理,直到播放器开始播放并将 Surface 填充为黑色。

我正在寻找一种方法来绘制黑色矩形以用黑色填充表面,但无法实现这一点。

android exoplayer android-textureview
4个回答
18
投票

使用 Grafika 上的 @fadden 链接,我制作了自己的脚本来清理表面。从 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);
}

2
投票

我不熟悉 Exoplayer,但我怀疑您的选项与使用 MediaPlayer 播放相同,列在这个答案中。

总结:

  • 您可以连接 GLES、清除 Surface、分离 GLES(Grafika 可以执行此操作)。
  • 您可以创建一帧黑色视频并播放。
  • 您可以创建第二个空视图来覆盖第一个视图。视频播放时隐藏,视频结束时显示。

您不能做的是附加 Canvas 并清除它,因为一旦附加了 Canvas,它就永远不会松开。


0
投票

请致电


        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

绘制新框架之前


0
投票

超级示例代码哈哈

确实适用于清除 SurfaceView, 像这样使用:

if (player != null) {
                player.stop();
                player.release();
            }

    if (binding.surfaceView.getHolder().getSurface().isValid()) {
                try {
                    clearSurface(binding.surfaceView);
                }catch (RuntimeException re){
                    re.printStackTrace();
                }
            }
© www.soinside.com 2019 - 2024. All rights reserved.