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