2017-03-20 4 views
1

Je veux développer une application pour appareil photo Android pour moi-même (peut la partager s'il y a des personnes intéressées) qui a une mise au point manuelle pendant l'enregistrement vidéo.Mise au point manuelle à l'aide de la caméra Android2 API

J'ai ajouté un SeekBar à l'échantillon google Camera2 app mais je ne peux pas trouver le moyen de mettre en œuvre la mise au point manuelle.

J'ai trouvé Manual focus in camera2, android mais cela ne fonctionne pas sur mon LG G4. L'application de caméra de stock est presque parfaite car elle ne permet pas la mise au point manuelle en mode vidéo.

Est-ce que quelqu'un d'entre vous a une idée?

EDIT: voici le code de l'auditeur 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); 
} 

Répondre

3

Vous devez vérifier si l'appareil que vous utilisez sur des supports en fait des commandes manuelles dans camera2.

La clé est de savoir si le available capabilities de l'appareil photo répertorie MANUAL_SENSOR. Si c'est le cas, vous pouvez contrôler l'objectif en réglant le autofocus mode sur OFF, puis en réglant le lens focus distance sur la valeur souhaitée. Si MANUAL_SENSOR n'est pas répertorié, il est très probable que le périphérique ne prenne pas en charge le contrôle manuel de la mise au point (certains fabricants utilisent des interfaces privées pour leur application de caméra par défaut afin d'activer le contrôle manuel de la mise au point, malheureusement).

Tout cela devrait aller dans la demande répétée que vous utilisez pour contrôler l'aperçu.

+0

Il y a un APK (https: //play.google.com/store/apps/details?id=com.sdgsystems.camera2probe) pour savoir si un périphérique prend en charge l'API Camera2 et si LG G4 dispose d'un support complet et si MANUAL_SENSOR est répertorié. J'ai essayé de régler le mode autofocus sur OFF mais lorsque j'ai réglé la distance de mise au point de l'objectif sur la valeur du SeekBar, cela ne fait rien. J'ai édité mon post principal pour ajouter le code que j'ai. – Rallph

+1

Où appelez-vous mSession.setRepeatingRequest (mPreviewBuilder.build()) après avoir mis à jour les valeurs du générateur de prévisualisation? –

+0

En fait, je ne l'appelle pas mais ça marche quand j'ai essayé 'onProgressChanged()', merci beaucoup! – Rallph

0

Eddy Talvala décrit tout correctement dans sa réponse, mais si vous vous sentez toujours compliqué, voici un extrait de code qui attribue le focus à l'infini (qui a une valeur 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); 
}