2017-10-18 89 views
0

我目前正在使用camera2 api在服務中錄製視頻。攝像機服務記錄

我不能找到一種方法,當預覽面被破壞更新camerasession的輸出列表。換句話說:當一個表面被銷燬時(例如當活動在後臺進行時)如何進行以保持記錄並避免由於空表面造成的崩潰。

這是我如何開始視頻錄製。

private void startRecordingVideo() { 
    if (null == mCameraDevice || null == mPreviewSize) { 
     return; 
    } 
    try { 
     closePreviewSession(); 
     setUpMediaRecorder(); 

     mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); 
     List<Surface> surfaces = new ArrayList<>(); 
     if(mTextureView !=null) { 
      SurfaceTexture texture = mTextureView.getSurfaceTexture(); 
      assert texture != null; 
      texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());   // Set up Surface for the camera preview 
      previewSurface = new Surface(texture); 
      surfaces.add(previewSurface); 
      mPreviewBuilder.addTarget(previewSurface); 
     } 

     // Set up Surface for the MediaRecorder 
     Surface recorderSurface = mMediaRecorder.getSurface(); 
     surfaces.add(recorderSurface); 
     mPreviewBuilder.addTarget(recorderSurface); 

     // Start a capture session 
     // Once the session starts, we can update the UI and start recording 
     mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() { 
      @Override 
      public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { 
       mPreviewSession = cameraCaptureSession; 
       updatePreview(); 
       mMediaRecorder.start(); 
      } 

      @Override 
      public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { 
       Timber.e("Error when creating captureSession"); 
      } 
     }, mBackgroundHandler); 
    } catch (CameraAccessException | IOException e) { 
     e.printStackTrace(); 
    } 

} 

當我將活動發送到後臺時:預覽表面被破壞,這是我奮鬥的地方。我應該如何更新我的capturesession,以便從會話輸出中刪除預覽表面而不停止捕獲進程?

回答

1

如果您不希望有再次預覽工作,你可以簡單地創建一個新的預覽請求,而不是添加的previewSurface進去,一旦TextureView不見了。

如果你想稍後連接起來預覽沒有中斷,這是更爲複雜。一種選擇是從你自己的SurfaceTexture開始,並使用它的attachToGlContext/detachFromGlContext調用以及GLSurfaceView或類似的。

然後你可以用表面紋理配置會話,每當你要顯示預覽,將其附加到GLSurfaceView的GL上下文和表面添加到您的預覽請求的目標。然後,當您想要停止顯示預覽時,從預覽目標中移除Surface並將其從GLSurfaceView中分離。這需要有你自己的GL繪圖代碼(基本上是你自己的迷你TextureView自定義行爲),所以它是很多樣板,但它是簡單的EGL(只需要繪製一個具有預覽紋理的四邊形)。