2017-10-18 4 views
0

現在、サービスでcamera2 apiを使用してビデオを録画しています。カメラサービスの録画

プレビューサーフェイスが破棄されたときに、カメラセッションの出力リストを更新する方法が見つかりません。言い換えれば、ある表面が破壊されたとき(例えば、活動がバックグラウンドになるとき)に、記録を維持し、ヌルサーフェスによるクラッシュを避けるときの対応。

これは、私がビデオの録画を開始する方法です。

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(); 
    } 

} 

アクティビティをバックグラウンドに送信すると、プレビューサーフェスが破棄され、これが苦労します。進行中のキャプチャを停止せずにプレビューサーフェイスをセッション出力から削除するには、キャプチャセッションをどのように更新する必要がありますか?

答えて

1

プレビューを再度実行したくない場合は、新しいプレビューリクエストを作成して、TextureViewがなくなればpreviewSurfaceを追加しないでください。

中断することなく後でプレビューを接続したい場合は、それはより複雑です。 1つのオプションは独自のSurfaceTextureで始まり、そのattachToGlContext/detachFromGlContext呼び出しをGLSurfaceViewなどと併用することです。

次に、SurfaceTextureでセッションを設定し、プレビューを表示したいときはいつでもGLSurfaceViewのGLコンテキストにアタッチして、プレビューリクエストターゲットにサーフェスを追加します。プレビューの表示を停止したい場合は、プレビューターゲットからサーフェスを削除し、GLSurfaceViewからサーフェスを切り離します。

あなた自身のGL描画コード(基本的に独自のビヘイビアを備えた独自のミニTextureView)が必要なので、定型文がたくさんありますが、単純なEGLです(プレビューテクスチャで四角形を描くだけでよい)。