6

我正在尝试在 Camera2(android.hardware.camera2) API 上以 60(或更高)fps 的速率录制视频。

最后,我使用CameraConstrainedHighSpeedCaptureSession以 120fps 的速度成功录制。但它只针对 >=120fps 的用例而不是 60fps。

即使我尝试使用普通捕获会话(CameraCaptureSession)以 60fps 的速度录制,它也只支持 <=30fps。我可以通过下面的代码弄清楚。

Range<Integer>[] fpsRanges = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);

我不知道如何使用 Camera2 API 以 60fps 的速度录制。

任何想法都会受到欢迎。

谢谢。

4

2 回答 2

1

您必须ConstrainedHighSpeedCaptureSession从 CameraDevice 创建一个并实例化一个新会话,就像您可能对普通捕获会话所做的那样。

您还需要为您的 Builder 设置下一个值:

myPreviewRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_USE_SCENE_MODE);
myPreviewRequestBuilder.set(CaptureRequest.CONTROL_SCENE_MODE, CaptureRequest.CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO);
myPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, new Range<Integer>(frameRate, frameRate));

之后,使用您的构建器生成 CaptureRequestList:

 myHighSpeedRequestList = ((CameraConstrainedHighSpeedCaptureSession) cameraCaptureSession).createHighSpeedRequestList(myPreviewRequestBuilder.build());

并在您的捕获会话中使用它来生成 CaptureSession:

mCaptureSession.setRepeatingBurst(myHighSpeedRequestList,
                                  YourHighSpeedVideoCaptureCallback,
                                  YourBackgroundHandler);
于 2016-06-27T13:17:23.853 回答
0

使用以下代码:

private fun recordSession() {
    setUpMediaRecorder()

    val surfaceTexture = textureView.surfaceTexture

    surfaceTexture?.setDefaultBufferSize(mPreviewSize!!.width, mPreviewSize!!.height)
    captureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD)
    val surfaces = ArrayList<Surface>()

    val textureSurface = Surface(surfaceTexture)
    surfaces.add(textureSurface)
    captureRequestBuilder.addTarget(textureSurface)


    val recordSurface = mediaRecorder.surface
    surfaces.add(recordSurface)
    captureRequestBuilder.addTarget(recordSurface)


    mCameraDevice.createCaptureSession(
        surfaces,
        object : CameraCaptureSession.StateCallback() {

            override fun onConfigured(session: CameraCaptureSession) {
                captureSession = session
                val fps: Int = if (PreferenceProvider.getIsFrontCameraOpened()) {
                    PreferenceProvider.getFrontCameraVideoFrameRate()
                } else {
                    PreferenceProvider.getBackCameraVideoFrameRate()
                }
                captureRequestBuilder.set(
                    CaptureRequest.CONTROL_MODE,
                    CaptureRequest.CONTROL_MODE_USE_SCENE_MODE
                )
                captureRequestBuilder.set(
                    CaptureRequest.CONTROL_SCENE_MODE,
                    CaptureRequest.CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO
                )
                captureRequestBuilder.set(
                    CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,
                    Range(fps, fps)
                )
                captureRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, currentExposureLevel)
                updatePreview()
                isRecording = true
                mediaRecorder.start()
            }

            override fun onConfigureFailed(session: CameraCaptureSession) {
                showLog(TAG, "Failed to create CameraRecordSession!")
            }

        },
        mBackgroundHandler
    )
}

注意:确保您在 MediaRecorder Configs 中设置相同的帧速率(即 60)以获得 60fps 的视频效果。

于 2022-02-22T11:17:57.080 回答