11

camera2 API を使用してビデオを録画しながら画像をキャプチャしたい。

2 つの個別のデモが利用可能です。1.画像をキャプチャするには2.ビデオを録画するには

それらをひとつのアプリにまとめてみました。しかし、多くのことに混乱しています。お気に入り

  • CameraDevice は、Android デバイスに接続された単一のカメラを表す single です。
  • リクエストには別のテンプレートが必要です。画像の場合:mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);およびビデオの場合mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
  • createCaptureSession メソッドでは ImageReader のサーフェスが必要で、ビデオの場合は MediaRecorder が必要です。

画像とビデオの両方の createCaptureSession メソッドで CameraCaptureSession.StateCallback が必要です。

そして camera2 API は新しいものです。そのため、Google で利用できる例はこれ以上ありません。

誰でもこれについて何か考えがありますか?Androidでの記録中に写真をキャプチャする方法が好きですか?

4

6 に答える 6

12

camera2 API とビデオ スナップショットについては、camera2video サンプルを多少改善する必要があります。

  • 3 つのキャプチャ ターゲット サーフェス: プレビュー (TextureView または SurfaceView)、JPEG (ImageReader)、および記録 (MediaRecorder または MediaCodec)。
  • 3 つすべてからサーフェスを createCaptureSession に渡します
  • ビデオを録画していないときは、繰り返しリクエストをプレビューのみを対象とするように設定します
  • ビデオを録画するときは、繰り返しリクエストをプレビューと録画面の両方を対象とするように設定し、mediarecorder を開始します (camera2video と同様)。記録を停止すると、繰り返し要求でターゲット プレビューのみに戻ります。
  • 写真を撮りたい場合は、JPEG サーフェス (プレビュー サーフェス) と、記録がアクティブな場合は記録サーフェスを対象とする要求を使用して、単一の capture() 呼び出しを発行します。
  • onImageAvailable コールバックが発生したときに ImageReader から JPEG を取得します。
于 2016-03-30T22:52:47.733 に答える
0

Eddy Talvalaの答えを拡張するには(私は魔女に同意します):

ビデオの録画中に 1 枚の写真をキャプチャする場合は、ImageReader の表面のみを対象とする単一の CaptureRequest を発行するだけです。ビデオ録画の繰り返し要求は停止しません。これにより、録画中のビデオからスナップショットを取得できます。

コードサンプルが必要な場合は、家に帰ったら投稿します。

于 2016-04-20T15:45:46.620 に答える
0
  public void onClick(View v) {
    // TODO Auto-generated method stub

    // if(v == myButton)
    // {
    if (recording) {
        // stop recording and release camera
        // type.setVisibility(View.GONE);1
        type.setText("");
        myChronometer.stop();
        myChronometer.setBase(SystemClock.elapsedRealtime());
        // mediaRecorder.stop(); // stop the recording
        releaseMediaRecorder(); // release the MediaRecorder object
        //
        myCamera.lock();
        recording = false;

        // "/sdcard/fivo_flim/" + "fivo_flim_"+video_no
        // + ".mp4";


        System.out.println("11111111111   "+SessionManager.getVideoCount(prefs1));

        new UploadPicture(VideoScreen.this, mApi, "/", new File(
                "/sdcard/record/" + "record"
                        + SessionManager.getVideoCount(prefs1) + ".mp4"))
                .execute();
        SessionManager.saveVideoCount(prefs1,
                SessionManager.getVideoCount(prefs1) + 1);

        mWakeLock.release();
        System.out.println("uuuuuuuuuuuuuuuuuu");
    } else {
        // Release Camera before MediaRecorder start
        releaseCamera();
        mWakeLock.acquire();

        if (!prepareMediaRecorder()) {
            Toast.makeText(
                    VideoScreen.this,
                    "Fail in PrepareCamera()!\n         \n   Please Insert SD Card or\n   Restart your phone ",
                    Toast.LENGTH_LONG).show();
            finish();
        }
        System.out.println("prepare media recorder");
        try {
            mediaRecorder.prepare();
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        System.out.println("Starting Media Recorder");
        try {
            mediaRecorder.start();
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println("exception is " + e);
        }
        type.setText("Recording...");

        myChronometer.setBase(SystemClock.elapsedRealtime());
        myChronometer.start();

        recording = true;
        myButton.setClickable(false);
        try {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    myButton.setClickable(true);
                }
            }, 3000);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

@SuppressLint({ "NewApi", "SdCardPath" })
private boolean prepareMediaRecorder() {
    myCamera = getCameraInstance();
    mediaRecorder = new MediaRecorder();
    myCamera.setDisplayOrientation(90);
    myCamera.unlock();
    mediaRecorder.setCamera(myCamera);
    mediaRecorder.setOrientationHint(90);
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    mediaRecorder.setProfile(CamcorderProfile
            .get(CamcorderProfile.QUALITY_HIGH));

    File mediaStorageDir = new File("/sdcard/record/");
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            Logger.Debug("failed to create directory");
        }
    }


    video_no=SessionManager.getVideoCount(prefs1);


    mFiles.add("/sdcard/record/" + "record" + video_no
            + ".mp4");
    mediaRecorder.setOutputFile("/sdcard/record/" + "record"
            + video_no + ".mp4");
    video_no++;

    mediaRecorder.setPreviewDisplay(myCameraSurfaceView.getHolder()
            .getSurface());

    try {
        mediaRecorder.prepare();

    } catch (IllegalStateException e) {
        releaseMediaRecorder();
        return false;

    } catch (IOException e) {
        releaseMediaRecorder();
        return false;
    }

    return true;

}

@SuppressLint("SdCardPath")
private void releaseMediaRecorder() {
    if (mediaRecorder != null) {
        mediaRecorder.reset();
        mediaRecorder.release();
        mediaRecorder = null;
        myCamera.lock();

    }
}

private void releaseCamera() {
    if (myCamera != null) {
        myCamera.release();
        myCamera = null;
    }

}

}
于 2016-03-30T21:09:36.187 に答える