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

时间:2016-02-19 16:36:36

标签: android egl

我有一个应用程序,可以从相机中捕获视频。 我是用于显示预览的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()
    
  4. 应用恢复时我在做什么:

    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();
      }
      
    3. 下次调用updateTextImage时,会发生此错误。

      任何想法为什么?

1 个答案:

答案 0 :(得分:2)

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

我不知道你把这个例子放在哪里,但我认为当相机变为空时,你可以预期其余的实例也会无效或无效。一切都需要重新创建。通常,大多数初始化都是在视图的构造函数内完成的,该构造函数派生自GlSurfaceView

换句话说:确保您通过与第一次运行期间相同的步骤。制作"初始化()"方法

有一个旧的tutorial显示了相机使用表面的基本知识。