2016-02-19 507 views
0

我有一個應用程序,它捕獲攝像頭的視頻。 我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) 

我在做什麼,當應用程序最小化:

  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被稱爲下一個時間,這個錯誤發生。

任何想法爲什麼?

回答

2

第一條線索是您的Surface與您的GlContext分離。

我不知道你把這個例子放在哪裏,但我認爲當相機變爲空時,你可以預期其餘的實例也被取消或失效。一切都需要重新創建。通常,大部分初始化都是在您的視圖的構造函數內完成的,該構造函數源自GlSurfaceView

換句話說:確保您通過與第一次運行時相同的步驟。做一個「Initialize()」方法。

有這個舊的tutorial顯示相機使用表面的基本。

+0

你說得對,當我在onStop中完全清理並在onStart完全重新初始化時,所有東西都變成了工作。 有趣的是,glSurfaceView中的表面被重新創建,當應用程序恢復並調用GlSurfaceView.onResume時,會再次調用方法GlSurfaceView $ Renderer.onSurfaceCreated()。根據這一點,我把我的第二個編碼線程的初始化調用放到onSurfaceCreated方法中,因此我可以確定在GLSurfaceView準備就緒後,編碼上下文和編碼表面將被初始化。 – Niakros

+0

當給它一個Surface時,MediaPlayer會發生同樣的問題。尊重生命週期是非常嚴格的,否則它將不斷在非法國家崩潰。 –

相關問題