簡體   English   中英

使用android camera2 API手動對焦

[英]Manual Focus using android camera2 API

我想為自己開發一款Android相機應用程序(如果有興趣的人可以共享它),在視頻錄制時有手動對焦。

我已經在谷歌樣本Camera2應用程序中添加了一個SeekBar,但我找不到實現手動對焦的方法。

在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);
}

您需要檢查您運行的設備是否實際支持camera2中的手動控制。

關鍵是相機設備的可用功能是否列出MANUAL_SENSOR 如果是這樣,則可以通過將自動對焦模式設置為OFF來控制鏡頭,然后將鏡頭焦距設置為所需的值。 如果未列出MANUAL_SENSOR,則設備很可能不支持手動對焦控制(不幸的是,有些制造商使用私有接口作為其默認相機應用來實現手動對焦控制)。

這些都應該進入你用來控制預覽的重復請求。

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM