我有一個應用程序,它捕獲攝像頭的視頻。 我isung GLSurfaceView顯示預覽和MediaCodec編碼。 GlSurfaceView擁有EGLContext自己的GLThread,並且爲MediaCodec創建另一個線程並初始化該線程中的另一個EGLContext。它的工作,我可以錄製視頻。SurfaceTexture.updateTexImage()失敗,因爲ivalid上下文
問題出現時,我試圖最小化,然後恢復應用程序。來電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被稱爲下一個時間,這個錯誤發生。
任何想法爲什麼?
你說得對,當我在onStop中完全清理並在onStart完全重新初始化時,所有東西都變成了工作。 有趣的是,glSurfaceView中的表面被重新創建,當應用程序恢復並調用GlSurfaceView.onResume時,會再次調用方法GlSurfaceView $ Renderer.onSurfaceCreated()。根據這一點,我把我的第二個編碼線程的初始化調用放到onSurfaceCreated方法中,因此我可以確定在GLSurfaceView準備就緒後,編碼上下文和編碼表面將被初始化。 – Niakros
當給它一個Surface時,MediaPlayer會發生同樣的問題。尊重生命週期是非常嚴格的,否則它將不斷在非法國家崩潰。 –