SurfaceTexture.updateTexImage() 由于上下文无效而失败

SurfaceTexture.updateTexImage() fails because of ivalid context

我有一个应用程序,可以从相机捕获视频。 我使用 GLSurfaceView 显示预览,使用 MediaCodec 进行编码。 GlSurfaceView 有自己的 GLThread 和 EGLContext,我正在为 MediaCodec 创建另一个线程并在该线程中初始化另一个 EGLContext。可以用了,可以录视频了。

当我尝试最小化然后恢复应用程序时出现问题。调用 SurfaceTexture.updateTexImage() 导致 IllegalStateException 并且 logcat 显示以下消息:

02-19 18:19:58.400 8528-15845 E/GLConsumer:[unnamed-8528-0] checkAndUpdateEglState: invalid current EGLContext 
02-19 18:19:58.400 8528-15845 E/_GLViewRender: error updating text image 
02-19 18:19:58.400 8528-15845 E/_GLViewRender: java.lang.IllegalStateException: Unable to update texture contents (see logcat for details)
02-19 18:19:58.400 8528-15845 E/_GLViewRender:     at android.graphics.SurfaceTexture.nativeUpdateTexImage(Native Method)
02-19 18:19:58.400 8528-15845 E/_GLViewRender:     at android.graphics.SurfaceTexture.updateTexImage(SurfaceTexture.java:240)
02-19 18:19:58.400 8528-15845 E/_GLViewRender:     at ui.GLSurfaceViewRender.onDrawFrame(GLSurfaceViewRender.java:105)
02-19 18:19:58.400 8528-15845 E/_GLViewRender:     at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1583)
02-19 18:19:58.400 8528-15845 E/_GLViewRender:     at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1286)

应用程序最小化时我在做什么:

  1. 正在停止相机预览:

    if (isPreviewOn && mCamera != null) {
        isPreviewOn = false;
        mCamera.stopPreview();
    }
    
  2. 释放相机:

    try {
        mCamera.setPreviewTexture(null);
    } catch (IOException e) {
        e.printStackTrace();
    }
    mCamera.release();
    mCamera = null;
    
  3. 通话中

    GLSurfaceView.onPause()
    

应用恢复时我在做什么:

  1. 通话中

    GLSurfaceView.onPause()
    
  2. 打开相机,设置预览表面纹理,开始预览

    if (mCamera == null) {
        mCamera = Camera.open(CAMERA_ID);
        params = mCamera.getParameters();
    }
    
    try {
        mCamera.setPreviewTexture(renderer.getSurfaceTexture());
    } catch (IOException e) {
        Log.e(TAG, "error setting ST to preview", e);
        return;
    }
    
    if (!isPreviewOn && mCamera != null) {
        isPreviewOn = true;
        mCamera.startPreview();
    }
    

并且下次调用updateTextImage时,会出现这个错误。

知道为什么吗?

第一个线索是您的 Surface 与 GlContext 分离。

我不知道你在哪里举了这个例子,但我认为当相机变为 null 时,你可以预期其余实例也将被取消或无效。一切都需要重新创造。通常,大部分初始化是在派生自 GlSurfaceView 的视图的构造函数中完成的。

换句话说:确保您完成与第一个 运行 相同的步骤。做一个"Initialize()"方法。

有这个旧的 tutorial 显示相机在表面上的基本用法。