【发布时间】: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)
当应用最小化时我在做什么:
-
停止相机预览:
if (isPreviewOn && mCamera != null) { isPreviewOn = false; mCamera.stopPreview(); } -
释放相机:
try { mCamera.setPreviewTexture(null); } catch (IOException e) { e.printStackTrace(); } mCamera.release(); mCamera = null; -
打电话
GLSurfaceView.onPause()
应用恢复时我在做什么:
-
打电话
GLSurfaceView.onPause() -
打开相机,设置预览表面纹理,开始预览
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的时候,就会出现这个错误。
有什么想法吗?
【问题讨论】: