2017-05-28 2 views
0

MISE À JOUR: question porte sur Camera2Qui fait pivoter le cadre d'une caméra lors du rendu dans un SurfaceTexture?

J'essaie de comprendre qui applique la transformation de rotation quand un aperçu de la caméra est dessiné sur une SurfaceTexture.

Lorsque vous demandez la taille d'aperçu de l'appareil photo, vous obtenez toujours des paires où la largeur est plus grande que la hauteur (parce que le paysage est l'orientation habituelle pour prendre une photo). Lorsque vous utilisez l'appareil en mode portrait et que vous réglez la taille de l'aperçu (par exemple, 1600 x 1200), les images de la caméra sont correctement tournées, mais je ne peux pas savoir où cela se fait, est-ce que CameraDevice Type de surface? ou est-ce le SurfaceTexture qui fait pivoter l'image?

Répondre

1

La réponse dépend un peu de l'API de la caméra que vous utilisez; puisque vous parlez de CameraDevice, je suppose que vous voulez dire camera2. À la caméra 2, l'un des objectifs était de simplifier le traitement de la rotation lorsque cela était possible; Ainsi, si vous dessinez un aperçu dans un SurfaceView, le service de caméra et le composant matériel/GPU coopèrent et gèrent toute la rotation pour vous. Vous demandez toujours des résolutions de paysage du capteur (qui est aligné avec le bord long du capteur correspondant au bord long de l'appareil), et vous devez juste vous assurer que le rapport d'aspect de votre SurfaceView correspond à celui de la résolution demandée (donc en portrait, vous avez besoin de 9h16 pour afficher 1080p correctement, en mode paysage, vous avez besoin d'une vue 16: 9).

Pour TextureView et le dessin GL entièrement personnalisé avec SurfaceTexture, l'API ne peut pas tout faire pour vous. La transformation SurfaceTexture est définie par l'API de caméra pour faire pivoter la sortie de la caméra vers l'orientation native de l'appareil (généralement portrait pour les téléphones, paysage pour certaines tablettes), mais elle ne peut pas gérer la rotation supplémentaire. .

Dans ce cas, vous devez obtenir la matrice de transformation à partir de SurfaceTexure, appliquer la rotation supplémentaire pour correspondre à l'interface utilisateur de votre application et la définir en tant que matrice TextureView.

+0

Je cherchais une confirmation sur le service de caméra et sur la "coopération" GPU. Merci –

0

Cela fait environ un an que j'ai travaillé sur des trucs de caméra, alors je m'excuse pour un manque de détails. Mais je me souviens que la clé lors de l'affichage de l'aperçu de la caméra était de calculer la matrice de transformation correcte à appliquer à SurfaceView (ou TextureView) pour appliquer toute mise à l'échelle ou rotation nécessaire. Donc, en ce qui concerne «qui fait la rotation», je suppose que vous pouvez dire que c'est la vue, comme indiqué par la transformation que vous fournissez. La matrice sera donc basée sur la relation entre la résolution de prévisualisation que vous demandez (à partir de la liste de ce qui est compatible avec votre appareil) et les dimensions réelles de votre vue, plus l'orientation physique du capteur de l'appareil par rapport au courant l'orientation de l'écran de l'appareil.

Dans l'ancienne API de caméra, Camera.CameraInfo possède un champ d'orientation qui fournit l'orientation physique avec laquelle le capteur est monté. Il est généralement de 90 pour un capteur monté sur le paysage sur la plupart des téléphones, mais vous trouverez également quelques 270 là-bas (effectivement "à l'envers"). 0 et 180 peuvent exister mais je ne les ai jamais vues.