【问题标题】:SurfaceTexture.updateTexImage() fails because of ivalid contextSurfaceTexture.updateTexImage() 由于无效的上下文而失败
【发布时间】:2016-02-25 01:29:48
【问题描述】:

我有一个应用程序,它从摄像头捕获视频。 我是用于显示预览的 GLSurfaceView 和用于编码的 MediaCodec。 GlSurfaceView 有它自己的带有 EGLContext 的 GLThread,我正在为 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的时候,就会出现这个错误。

有什么想法吗?

【问题讨论】:

    标签: android egl


    【解决方案1】:

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

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

    换句话说:确保您通过与第一次运行时相同的步骤。制作一个“Initialize()”方法。

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

    【讨论】:

    • 你是对的,当我在 onStop 中进行全面清理并在 onStart 中完全重新初始化时,一切都开始工作了。有趣的是,重新创建 glSurfaceView 中的表面并在应用程序恢复并调用 GlSurfaceView.onResume 时再次调用方法 GlSurfaceView$Renderer.onSurfaceCreated() 。基于此,我将我的第二个编码线程的初始化调用放入 onSurfaceCreated 方法中,因此我可以确定在 GLSurfaceView 准备好后将初始化编码上下文和编码表面。
    • MediaPlayer 在给它一个 Surface 时也会出现同样的问题。有一个非常严格的生命周期要尊重,否则它会在非法状态下不断崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多