首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Camera2录制60fps视频(安卓21版)接口

使用Camera2录制60fps视频(安卓21版)接口
EN

Stack Overflow用户
提问于 2016-06-23 15:52:38
回答 2查看 8K关注 0票数 5

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

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

即使我尝试使用普通捕获会话(CameraCaptureSession)以60fps的速度录制,它也只支持<=30fps。我可以通过下面的代码来解决这个问题。

代码语言:javascript
复制
Range<Integer>[] fpsRanges = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);

我不知道如何用Camera2 API录制60fps的视频。

任何想法都是最受欢迎的。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2016-06-27 21:17:24

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

此外,您还需要将下一个值设置为您的Builder:

代码语言:javascript
复制
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:

代码语言:javascript
复制
 myHighSpeedRequestList = ((CameraConstrainedHighSpeedCaptureSession) cameraCaptureSession).createHighSpeedRequestList(myPreviewRequestBuilder.build());

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

代码语言:javascript
复制
mCaptureSession.setRepeatingBurst(myHighSpeedRequestList,
                                  YourHighSpeedVideoCaptureCallback,
                                  YourBackgroundHandler);
票数 0
EN

Stack Overflow用户

发布于 2022-02-22 11:17:57

使用以下代码:

代码语言:javascript
复制
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配置中设置相同的帧率(即60),才能在视频中获得60fps的效果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37985383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档