我想使用Camera 2 API的setRepeatingRequest()
模式拍攝1fps的靜態圖片。使用setRepeatingRequest的Android Camera 2 API 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();
}
不幸的是,setPreviewFpsRange()不會讓它更容易,因爲你只能選擇一個支持的範圍。大多數設備不會將1 fps列爲支持的幀速率。 –
@AlexCohn你是完全正確的。但正確使用SENSOR_FRAME_DURATION的簡單方法必須做到訣竅 – webo80
不一定。我不確定[SENSOR_INFO_MAX_FRAME_DURATION](https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#SENSOR_INFO_MAX_FRAME_DURATION)會說明什麼。對於全功能設備,保證至少100ms,但對其他設備沒有保證,甚至可能是** null **。 –