使用 Camera2(Android 版本 21)API 录制 60fps 视频

Posted

技术标签:

【中文标题】使用 Camera2(Android 版本 21)API 录制 60fps 视频【英文标题】:Recording 60fps video with Camera2(on Android version 21) API 【发布时间】:2016-10-25 10:04:21 【问题描述】:

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

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

即使我尝试使用普通捕获会话 (CameraCaptureSession) 以 60fps 的速度录制,它也只支持

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

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

欢迎提出任何想法。

谢谢。

【问题讨论】:

你找到解决办法了吗? 【参考方案1】:

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

您还需要为您的 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);

【讨论】:

这不是用于 >= 120 fps 的视频捕获吗? 我修改了 CONTROL_AE_TARGET_FPS_RANGE 以获得我想要使用的范围 我不能分享很多这段代码:S。但无论如何,我只是创建一个 ConstrainedHighSpeedCaptureSession,将我之前发布的 3 个集合添加到构建器,创建列表并设置 RepeatingBurst。没有别的,只是捕获异常和一些条件以避免相机设备或会话为空时强制关闭 此答案无效。您不能使用高速捕获会话进行 60 FPS 录制,期间。 @FranciscoDurdinGarcia 我完全不同意你的回答。为什么CameraConstrainedHighSpeedCaptureSession 的文档会如此错误?【参考方案2】:

使用以下代码:

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 的视频效果。

【讨论】:

以上是关于使用 Camera2(Android 版本 21)API 录制 60fps 视频的主要内容,如果未能解决你的问题,请参考以下文章

支持 Android Camera Api 和 Camera2 Api 的问题

调用需要 API 级别 21(当前最低为 17):android.hardware.camera2.CameraDevice.StateCallback

只有一个带有 Camera2 和旧相机 API 的 APK

camera2(API 级别 21)是不是暴露了所有旧摄像头?

Android Camera2 拍照入门学习

Android Camera2拍照——使用SurfaceView