gpt4 book ai didi

使用 setRepeatingRequest 的 Android Camera 2 API 1fps

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:12:14 25 4
gpt4 key购买 nike

我想使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com