2016-10-14 24 views
3

タイトルによると、Camera2 APIを使用してSamsung Note5にビデオを録画する際に問題が発生しています。ImageReaderを使用した後のCamera2 APIのSamsung Note5での録画ビデオの録画

私はCamera2Videoサンプルから自分のコードを適応してきましたが、違いは、私のセットアップMediaRecorderCamcorderProfileクラスから設定オプションを使用していること、また、ビデオ録画を開始する前にプレビューしながら、私はImageReaderに取り込むだけでなく、していますということでプレビューをSurfaceTextureにレンダリングします(このサンプルではImageReaderは使用されません)。

ここに私のstartVideoCapture機能(サンプルとほぼ同じ)

private boolean startVideoCapture() { 
    if (null == mCameraDevice || !mTextureView.isAvailable() || null == mPreviewSize) { 
     debugToast("Can't start video preview"); 
     return false; 
    } 
    try {   
     closePreviewSession(); 
     if(!setUpMediaRecorder()) 
     { 
      debugToast("setUpMediaRecorder failed"); 
      return false; 
     } 
     SurfaceTexture texture = mTextureView.getSurfaceTexture(); 
     assert texture != null; 
     texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 
     final CaptureRequest.Builder previewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); 
     List<Surface> surfaces = new ArrayList<Surface>(); 

     Surface previewSurface = new Surface(texture); 
     surfaces.add(previewSurface); 
     previewRequestBuilder.addTarget(previewSurface); 

     Surface recorderSurface = mMediaRecorder.getSurface(); 
     surfaces.add(recorderSurface); 
     previewRequestBuilder.addTarget(recorderSurface); 

     mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() { 

      @Override 
      public void onConfigured(CameraCaptureSession cameraCaptureSession) { 
       debugToast("onConfigured callback received"); 
       mCaptureSession = cameraCaptureSession; 
       updateVideoPreview(previewRequestBuilder); 
      } 

      @Override 
      public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) { 
       debugToast("onConfigureFailed");      
      } 
     }, mCallbacksInterface.getBackgroundHandler()); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
     debugToast("CameraAccessException"); 
     return false; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     debugToast("IOException"); 
     return false; 
    } 
    debugToast("startVideoCapture success");   
    return true; 
} 

そして、ここでは、プレビューを開始するとき、私は、画像読取装置をセットアップする私のコードですです:それはすべてのかなり標準のものだ

 // We set up a CaptureRequest.Builder with the output Surface. 
     CaptureRequest.Builder previewRequestBuilder = mCameraDevice 
       .createCaptureRequest(templateType); 

     previewRequestBuilder.addTarget(mImageReader.getSurface()); 
     previewRequestBuilder.addTarget(surface); 

     // Here, we create a CameraCaptureSession for camera preview. 
     // surface), 
     mCameraDevice.createCaptureSession(
       Arrays.asList(mImageReader.getSurface(), surface), 
       new CameraCaptureSession.StateCallback() { 

     // etc... 

Nexus 5ではうまくいきます。キャプチャサーフェスのリストでImageReaderを使ってプレビュー用のキャプチャセッションを開始してから停止し、サーフェスリストにMediaRecorderという新しいセッションを開始してビデオを録画できます。しかし、これは注5では機能しません。

10-14 14:49:25.991: E/CameraCaptureSession(13566): Session 1: Failed to create capture session; configuration failed 
10-14 14:49:26.011: W/System.err(13566): android.hardware.camera2.CameraAccessException: Operation timed out in camera service 
10-14 14:49:26.011: W/System.err(13566): at android.hardware.camera2.utils.CameraBinderDecorator.throwOnError(CameraBinderDecorator.java:118) 
10-14 14:49:26.021: W/System.err(13566): at android.hardware.camera2.utils.CameraBinderDecorator$CameraBinderDecoratorListener.onAfterInvocation(CameraBinderDecorator.java:73) 
10-14 14:49:26.021: W/System.err(13566): at android.hardware.camera2.utils.Decorator.invoke(Decorator.java:81) 
10-14 14:49:26.021: W/System.err(13566): at java.lang.reflect.Proxy.invoke(Proxy.java:393) 
10-14 14:49:26.021: W/System.err(13566): at $Proxy1.waitUntilIdle(Unknown Source) 
10-14 14:49:26.021: W/System.err(13566): at android.hardware.camera2.impl.CameraDeviceImpl.waitUntilIdle(CameraDeviceImpl.java:950) 
10-14 14:49:26.021: W/System.err(13566): at android.hardware.camera2.impl.CameraDeviceImpl.configureStreamsChecked(CameraDeviceImpl.java:399) 
10-14 14:49:26.021: W/System.err(13566): at android.hardware.camera2.impl.CameraDeviceImpl.createCaptureSessionInternal(CameraDeviceImpl.java:561) 
10-14 14:49:26.021: W/System.err(13566): at android.hardware.camera2.impl.CameraDeviceImpl.createCaptureSession(CameraDeviceImpl.java:476) 
10-14 14:49:26.021: W/System.err(13566): at com.example.Camera2Object.startVideoCapture(Camera2Object.java:2262) 

私はプレビューキャプチャからImageReaderを削除した場合、それは正常に動作します:startVideoCaptureMediaRecordercreateCaptureSessionを呼び出すときに、私はクラッシュを取得します。私はclosePreviewSessionImageReaderないか(私はすでにプレビューCaptureSessionabortCapturescloseを呼んでいる)違いはありませんを閉じるかどうか

誰もこれを解決する方法を知っていますか?

編集:このデバイスでImageReaderを使用している場合、をで閉じると、非常に長い時間がかかります(最大6秒間)。私はほとんど別のスレッドでそれを行うことによって、ユーザーからこれを隠すことに成功しましたが、もしonResumeがの6秒以内に呼び出されると、私はそれを再び開くことができる前に終了を待たなければならないので、 。明らかに、私は録画を開始するときに6秒の待ち時間を取ることができません。

acquireLatestImage()に電話しても問題が解決したら、それを閉じて、ImageReaderonImageAvailableコールバックにすぐに戻ります。 ImageReaderのキャプチャ解像度が本当に小さい場合にも発生します。だから、ImageReaderデータの処理が過負荷になっているようには見えません。

アプリの開始から録画までのシステムログ(およびアプリのシャットダウン)はthis Pastebinです。あなたペーストビンログから

+0

アプリの起動にかかる期間のフルシステムログ(logcat)出力があり、ビデオ録画を開始しようとすると、何が起こっているのかを簡単に伝えることができます。これには、カメラサービスとカメラHALからのログが含まれます。 –

+0

@EddyTalvalaログが大きすぎて質問に編集できなかったので、ここに投稿しました:http://pastebin.com/uqyaC5aM – samgak

答えて

2

10-15十九時45分32秒。501:E/Camera3-Device(3151):カメラ0:waitUntilDrainedLocked:HALが排除されるのを待つ間エラー:接続タイムアウト(-110)

これは一般に、カメラの邪魔になったことを意味します。カメラサービスは、新しいセッションを作成する前に機内キャプチャが完了するのを待っていますが、戻ってこない人もいます。だから事がタイムアウトし、エラーがアプリに返されます。

これは、デバイス固有のカメラコードのバグです。残念ながら、サムスンはそれを修正する必要があります。

回避策として、繰り返し要求を停止し、すべての機内リクエストが完了するまで待って(デバイスが「準備完了」状態に切り替わる)、新しいセッションを作成します。その後、HALが誤って処理するためにまだ進行中のキャプチャはありません。

これにより余分な遅延が発生し、プレビューが少し長くフリーズしますが、この場合はおそらくより堅牢です。

+0

ありがとう、回避策が動作します。このバグに遭遇した他の人には注意してください。ビデオ録画を停止しプレビューを再開するときに同じことをする必要はありません。それは期待どおりに動作します。 – samgak

関連する問題