2017-10-18 5 views
0

Je suis en train d'enregistrer des vidéos en utilisant l'API camera2 dans un service.Enregistrement de service de caméra

Je n'arrive pas à trouver un moyen de mettre à jour la liste de sortie d'une cameraession lorsque la surface de prévisualisation est détruite. En d'autres termes: que faire quand une surface est détruite (quand l'activité passe en arrière-plan par exemple) pour continuer à enregistrer et éviter les crashs dus à une surface nulle.

C'est ainsi que je commence l'enregistrement de la vidéo. Quand je renvoie l'activité à l'arrière-plan: la surface de prévisualisation est détruite, et c'est là que je me bats. Comment dois-je mettre à jour mon catchession afin de supprimer la surface de prévisualisation de la sortie de la session sans arrêter la capture en cours?

Répondre

1

Si vous ne voulez plus jamais que l'aperçu fonctionne à nouveau, vous pouvez simplement créer une nouvelle demande d'aperçu, et ne pas y ajouter la previewSurface, une fois TextureView disparu.

Si vous souhaitez connecter ultérieurement un aperçu sans interruption, c'est plus compliqué. Une option est de commencer avec votre propre SurfaceTexture, et d'utiliser ses appels attachToGlContext/detachFromGlContext avec un GLSurfaceView ou similaire.

Ensuite, vous pouvez configurer une session avec SurfaceTexture, et chaque fois que vous voulez afficher l'aperçu, attachez-le au contexte GL d'un GLSurfaceView et ajoutez la surface à vos cibles de demande d'aperçu. Ensuite, lorsque vous souhaitez arrêter d'afficher l'aperçu, supprimez la surface des cibles d'aperçu et détachez-la de GLSurfaceView.

Cela nécessite d'avoir votre propre code de dessin GL (essentiellement votre propre mini TextureView avec un comportement personnalisé), donc c'est beaucoup, mais c'est simple EGL (il suffit de dessiner un quadrilatère avec la texture de prévisualisation).