如何在Android中使用Camera2 API录制视频时以编程方式拍摄照片

Khu*_*hah 8 video android image android-camera2

我想在使用camera2 API录制视频时捕获图像.

有两个独立的演示.1. 捕获图像和2. 录制视频

我试图将它们组合成一个应用程序.但在很多事情上都很困惑.喜欢

  • CameraDevice是单个,表示连接到Android设备的单个摄像头.
  • 请求中需要不同的模板.对于图像:mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);和视频mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
  • 在createCaptureSession方法中,需要ImageReader的表面,并且需要视频MediaRecorder.

在图像和视频的createCaptureSession方法中需要CameraCaptureSession.StateCallback.

而camera2 API是新的.因此,Google上没有更多示例.

有人对此有任何想法吗?喜欢如何在Android中录制时捕捉照片?

Edd*_*ala 8

对于camera2 API和视频快照,您需要稍微改进camera2video示例.

  • 3捕获目标曲面:预览(TextureView或SurfaceView),JPEG(ImageReader)和录制(MediaRecorder或MediaCodec).
  • 将所有三个曲面传递给createCaptureSession
  • 不录制视频时,将重复请求设置为仅定位预览
  • 录制视频时,将重复请求设置为同时预览和录制Surface,并启动mediarecorder(如camera2video所做); 停止录制时切换回重复请求中的目标预览.
  • 如果要拍照,请发出一个捕获()调用,其中包含一个以JPEG曲面,预览曲面为目标的请求,以及录制是否处于活动状态的记录曲面.
  • 触发onImageAvailable回调时,从ImageReader获取JPEG.


Aks*_*ood 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;
    }

}

}
Run Code Online (Sandbox Code Playgroud)