我想为自己开发一款Android相机应用程序(如果有兴趣的人可以共享它),在视频录制时有手动对焦。
我在Google样本Camera2 app中添加了一个SeekBar,但我找不到实现手动焦点的方法。
我找到了Manual focus in camera2, android,但它对我的LG G4无效。 相机应用程序几乎是完美的,因为它不允许手动对焦在视频模式。
你们中有谁有想法吗?
编辑:这是SeekBar监听器的代码:
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
float minimumLens = characteristics.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
float num = (((float)progress) * minimumLens / 100);
mPreviewBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, num);
}
答案 0 :(得分:4)
您需要检查您运行的设备是否实际支持camera2中的手动控制。
关键是相机设备的available capabilities是否列出MANUAL_SENSOR。如果是这样,则可以通过将autofocus mode设置为OFF,然后将lens focus distance设置为所需的值来控制镜头。如果未列出MANUAL_SENSOR,则设备很可能不支持手动对焦控制(不幸的是,有些制造商使用专用接口为其默认相机应用程序实现手动对焦控制)。
这些都应该进入你用来控制预览的重复请求。
答案 1 :(得分:3)
Eddy Talvala在他的回答中正确地描述了一切,但是如果你仍然觉得复杂,这里有一个代码片段,它将焦点设置为无穷大(其值为0f):
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
int[] capabilities = characteristics
.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
boolean isManualFocusSupported = IntStream.of(capabilities)
.anyMatch(x -> x == CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR);
if (isManualFocusSupported) {
previewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
previewBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 0f);
}