使用 setRepeatingRequest 的 Android Camera 2 API 1fps

标签 android camera android-camera android-camera2

我想使用 Camera 2 API 的 setRepeatingRequest() 模式拍摄 1fps 的静态图像。

我将 CONTROL_AE_MODE 设置为 CONTROL_AE_MODE_OFF 并将 SENSOR_FRAME_DURATION 设置为 1。但是,使用以下代码我仍然收到 20fps 的非常高的帧速率。

我尝试将捕获请求模板从 TEMPLATE_PREVIEW 更改为 TEMPLATE_STILL_CAPTURE 但没有成功。如何使用 setRepeatingRequest() 实现 1fps?

CaptureRequest.Builder requestBuilder
            = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
    requestBuilder.addTarget(imageReader.getSurface());
        cameraDevice.createCaptureSession(Collections.singletonList(imageReader.getSurface()),
            new CameraCaptureSession.StateCallback() {

                @Override
                public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
                    // The camera is already closed
                    if (cameraDevice == null) {
                        return;
                    }

                    captureSession = cameraCaptureSession;
                    try {
                        requestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                                CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
                        requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
                        requestBuilder.set(CaptureRequest.SENSOR_FRAME_DURATION, 1L);

                        CameraCaptureSession.CaptureCallback captureCallback
                                = new CameraCaptureSession.CaptureCallback() {

                            @Override
                            public void onCaptureCompleted(@NonNull CameraCaptureSession session,
                                    @NonNull CaptureRequest request,
                                    @NonNull TotalCaptureResult result) {
                            }
                        };

                        captureSession.setRepeatingRequest(
                                requestBuilder.build(), captureCallback, callbackHandler);
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onConfigureFailed(
                        @NonNull CameraCaptureSession cameraCaptureSession) {
                }
            }, null);
} catch (CameraAccessException e) {
    e.printStackTrace();
}

最佳答案

首先SENSOR_FRAME_DURATION中的单位是纳秒,根据the docs

所以试试 requestBuilder.set(CaptureRequest.SENSOR_FRAME_DURATION, 1000000L);

此外,您还可以使用 CountDownTimer 并每 1 秒拍摄一张照片,这不太优雅。我知道这很糟糕,因为您每秒钟都在初始化所有相机内容,但这是一个可行的解决方案。一个例子是:

new CountDownTimer(5000,1000){
    @Override
    public void onFinish() { (...) }

    @Override
    public void onTick(long millisUntilFinished) {
        // TODO take picture
    }
}.start();

第三种解决方案是使用 Camera.Parameters [setPreviewFpsRange]( https://developer.android.com/reference/android/hardware/Camera.Parameters.html#setPreviewFpsRange(int , int)),但它需要 Camera API 而不是 Camera2。但这只是另一种可能

关于使用 setRepeatingRequest 的 Android Camera 2 API 1fps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46748587/

相关文章:

camera - 运行 RPi-Cam-Web-Interface

java - 使用相机 API 在 Android 上切换相机

Android - 相机 Intent ,返回空结果

android - 启动设置类的 Activity

android - 为什么 Android location.distanceTo 返回以百万为单位的值?

python - 用于沿 (x,y) 网格移动相机的 Mel/Python 脚本

android - 在某些手机中拍摄时照片会旋转 90 度

android - 在 camera2 api 中预览拉伸(stretch)

java - 简单的 XML 框架 : Having an "inline like" behaviour for objects in ElementMap

android - 如何从相机拍摄的照片制作缩略图?