タイトルによると、Camera2 APIを使用してSamsung Note5にビデオを録画する際に問題が発生しています。ImageReaderを使用した後のCamera2 APIのSamsung Note5での録画ビデオの録画
私はCamera2Videoサンプルから自分のコードを適応してきましたが、違いは、私のセットアップMediaRecorder
がCamcorderProfile
クラスから設定オプションを使用していること、また、ビデオ録画を開始する前にプレビューしながら、私は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
を削除した場合、それは正常に動作します:startVideoCapture
でMediaRecorder
とcreateCaptureSession
を呼び出すときに、私はクラッシュを取得します。私はclosePreviewSession
でImageReader
ないか(私はすでにプレビューCaptureSession
上abortCaptures
とclose
を呼んでいる)違いはありませんを閉じるかどうか
。
誰もこれを解決する方法を知っていますか?
編集:このデバイスでImageReader
を使用している場合、をで閉じると、非常に長い時間がかかります(最大6秒間)。私はほとんど別のスレッドでそれを行うことによって、ユーザーからこれを隠すことに成功しましたが、もしonResume
がの6秒以内に呼び出されると、私はそれを再び開くことができる前に終了を待たなければならないので、 。明らかに、私は録画を開始するときに6秒の待ち時間を取ることができません。
acquireLatestImage()
に電話しても問題が解決したら、それを閉じて、ImageReader
のonImageAvailable
コールバックにすぐに戻ります。 ImageReader
のキャプチャ解像度が本当に小さい場合にも発生します。だから、ImageReader
データの処理が過負荷になっているようには見えません。
アプリの開始から録画までのシステムログ(およびアプリのシャットダウン)はthis Pastebinです。あなたペーストビンログから
アプリの起動にかかる期間のフルシステムログ(logcat)出力があり、ビデオ録画を開始しようとすると、何が起こっているのかを簡単に伝えることができます。これには、カメラサービスとカメラHALからのログが含まれます。 –
@EddyTalvalaログが大きすぎて質問に編集できなかったので、ここに投稿しました:http://pastebin.com/uqyaC5aM – samgak