12
votes

Camera.Release () prend 30 secondes pour libérer la caméra dans Nexus 10. Y a-t-il un moyen d'accélérer le processus?

J'utilise le code suivant pour relâcher la caméra en Onpause. Mais la ligne Mcamera.Release () prend 30 secondes en moyenne pour libérer la caméra dans le périphérique Nexus 10. J'ai ajouté une journalisation avant et après Mcamera.Release () et j'ai constaté que la différence de temps entre l'impression de ces journaux est de 30 secondes.

private void releaseCamera() {
    if (mCamera != null) {
        previewing = false;
        mCamera.setPreviewCallback(null);
        if(mPreview != null)
        mPreview.getHolder().removeCallback(mPreview);
        Log.e("QR","Starting to call mCamera.release()");
        mCamera.release();
        Log.e("QR","Released Camera");
        mCamera = null;
    }
}


11 commentaires

Je crée de nombreux threads dans mon application. Est-ce que cela provoque le problème? Si oui, comment puis-je vérifier cela sans enraciner l'appareil?


La réduction de la taille de l'aperçu de (1080.1920) à une taille inférieure (480 800) présente des changements importants dans la performance. Est la caméra.Release () a une relation avec la taille de la prévisualisation? Et s'il y a un retard dans la caméra libération, le temps pris est presque une constante - 320ms ou 30 secondes pour Nexus 10 - Quelle est la raison derrière elle?


Appelez-vous mcamera.stoppreview () ?


@fadden Oui, j'appelle mcamera.stoppreview () Avant d'appeler Releasecamera ().


Voyez-vous des problèmes similaires dans d'autres applications? Grafika ( Github.com/google/grafika ) a quelques activités basées sur la caméra, par ex. "Afficher + caméra de capture", et je l'exécute régulièrement sur le Nexus 10. Appelez-vous cela à partir d'Onpause ()? Y a-t-il quelque chose qui a l'air liés à la caméra dans LogCat pendant cette période?


@fadden: Toutes les autres applications de la caméra fonctionnent bien. Dans mon application, lorsque je ne crée pas les threads, l'activité de la caméra fonctionne bien. Le nombre de threads a-t-il quelque chose à voir avec la libération de la caméra?


Je ne peux pas penser à une raison pour laquelle avoir beaucoup de threads décrocherait des choses, sauf si beaucoup d'entre eux y étaient si occupés et ils étaient si occupés qu'ils ont totalement affamé votre épaule pendant 30 secondes. Semble improbable. En regardant une trace de pile pourrait aider.


Même je pensais avoir tant de threads était le problème. Ce que je ne comprends pas, c'est abaisser la taille de la prévisualisation empêche le stand avec le même non de threads. Quelle est la relation entre caméra.Release (), prévisualisation et threads. @fadden Je téléchargerai la trace de la pile dès que possible.


Si vous regardez le code de l'API de caméra2 ( Github.com / Android / Platform_Hardware_LIBHARDWARE / BLOB / MASTE R / ... ), ligne 284, vous obtenez les erreurs de trace de la pile que vous voyez dans votre application. Il semble que le Hal attend que toutes les opérations de la caméra soient terminées avant de la clôturer et que quelque chose bloque votre libération. Au moment de la libération (30 secondes, je suppose), le Hal se déconnecte. Il y a une ligne intéressante dans ce code: // TODO: Configurez les notifications de HAL, au lieu de dormir ici. Cela pourrait être un peu implumé sur le Nexus 10 ...


Économisez-vous l'image ou quelque chose avant de libérer la caméra? Si tel est le cas, déplacez la pièce d'économie dans un fil d'arrière-plan. Les opérations d'E / S consomment du temps et peuvent bloquer le fil principal.


Dans notre exemple, nous ne sauvons rien.


3 Réponses :


5
votes

Vous pouvez essayer de libérer la caméra à l'intérieur d'un fil de contournement pour cela, mais ce n'est pas une solution idéale. Vous pouvez lancer votre prochaine activité lorsque la fonction de version exécute en arrière-plan xxx


1 commentaires

Nous utilisons cette solution de contournement. Cependant, ce n'est pas idéal comme si la caméra doit être à nouveau ouverte, l'utilisateur ne pourra pas le faire.



1
votes

Dilip, c'est le problème dans le Nexus 10, cochez ce Nexus 10 caméra.Release se bloque pendant 30 secondes .

Nous avons essayé avec ces choses, p>

p>

new Thread(new Runnable(){
    public void run(){
        camera.stopPreview();
    camera.setPreviewCallback(null);
    camera.unlock();
    camera.release();
    camera = null;
    }
}).start();


2 commentaires

Suggestion ne fonctionne pas ici sur Nexus 10. Nous recherchons une solution ou une solution de contournement qui fonctionnerait.


@ssasa Nous avons identifié ces erreurs se produisent dans Nexus si vous n'avez pas ouvert et fermé correctement, après un certain temps, cela devient un problème. C'est la raison, j'ai fourni le script que nous avons utilisé pour la fermeture de la caméra correctement et aussi, de travailler, nous mettons en œuvre cette API de la caméra 2 semaines. Probablement, à cette fin de la semaine, je peux commenter une chose à ce sujet.



0
votes

Je n'ai pas besoin de niveau de réputation pour ajouter un commentaire, je vais donc la mettre ici: xxx

}). Démarrer ();

Quand L'appel de libération sera exécuté dans un thread séparé, cela entraînera un problème d'autre application utilisant la caméra et sera lancée en plus de cela. Je cherche aussi la solution. Je n'ai pas de Nexus10. Nous avons votre propre appareil.


0 commentaires