L'évasion de capture d'appareil photo Android 2 est trop lente

J'essaie de modifier le code android-Camera2Basic pour capturer un éclat d'images. Cependant, je ne peux pas obtenir le délai entre les images plus rapidement que 200-300 ms sur mon Nexus 5, en cours d'exécution L 5.0.1.

J'ai essayé beaucoup de choses, mais c'est le plus élémentaire. C'est la seule partie du code Camera2Basic que j'ai modifié. Mon aperçu TextureView est seulement 50x50dp, mais cela ne devrait pas être important, n'est-ce pas?

  • Comment puis-je supprimer l'indicateur de tabulation sélectionné du TabWidget?
  • Obtenez l'élément visible au centre de RecycleView lors du défilement
  • Comment obtenir l'heure actuelle dans Android
  • Pourquoi mon service Android est-il redémarré lorsque le processus est tué, même si j'ai utilisé START_NOT_STICKY?
  • Google Map v2 ou v3?
  • Comment synchroniser la base de données SQLite sur le téléphone Android avec la base de données MySQL sur le serveur?
  • Pour ce qu'il vaut, ce code n'a que des retards autour de 50-100 ms sur mon Nexus 6, avec L 5.1.

    private void captureStillPicture() { try { List<CaptureRequest> captureList = new ArrayList<CaptureRequest>(); mPreviewRequestBuilder.addTarget(mImageReader.getSurface()); for (int i=0;i<10;i++) { captureList.add(mPreviewRequestBuilder.build()); } mCaptureSession.stopRepeating(); mCaptureSession.captureBurst(captureList, cameraCaptureCallback, null); mPreviewRequestBuilder.removeTarget(mImageReader.getSurface()); } catch (CameraAccessException e) { e.printStackTrace(); } } CameraCaptureSession.CaptureCallback cameraCaptureCallback = new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { Log.d("camera","saved"); mPictureCounter++; if (mPictureCounter >= 10) unlockFocus(); } }; 

  • Programmation Wi-Fi dans Android
  • Comment créer une barre d'évaluation personnalisée dans Android
  • Emulateur Visual Studio pour Android bloqué sur "OS démarre ...", uniquement sur API Level 23 / Android 6
  • Meilleure pratique pour mettre à jour les arguments d'un fragment?
  • Comment ajouter le répertoire d'outils Android au chemin d'accès Windows 7?
  • Android, AsyncTask, vérifiez le statut?
  • 3 Solutions collect form web for “L'évasion de capture d'appareil photo Android 2 est trop lente”

    Le problème que vous rencontrez est un artefact du format de sortie d'image que vous avez demandé. Le processus de codage JPEG met un temps de décrochage important sur le pipeline de la caméra, donc il y a beaucoup de temps d'arrêt entre une fois qu'une exposition se termine et la prochaine commence alors que ce codage se produit.

    Le taux de 30fps cité peut être obtenu en définissant le format d'image de sortie sur ImageReader comme YUV, puisqu'il s'agit d'une sortie plus "native" pour la caméra. Ce serait la façon de stocker les images lorsqu'elles sont capturées, et ensuite vous devriez faire un codage JPEG après, séparé du traitement en ligne de la caméra.

    Par exemple, sur le Nexus 5, le temps d'arrêt de sortie pour le codage JPEG est de 243 ms, ce que vous avez observé. Pour la sortie YUV_420_888 , il est de YUV_420_888 . De même, en raison de leur grande taille, l'encodage RAW_SENSOR introduit un temps de décrochage de 200 ms.

    Notez également que même si vous supprimez l'obstacle du temps de décrochage en choisissant un format "plus rapide", il existe encore un temps d'image minimum, selon la taille de l'image de sortie. Mais pour une sortie de résolution complète de Nexus 5, c'est 33 ms, ce que vous attendiez.

    L'information pertinente se trouve dans l'objet StreamConfigurationMap la métadonnée de la caméra, ici . Vérifiez les getOutputStallDuration(int format, Size size) et getOutputMinFrameDuration(int format, Size size) pour la confirmation.

    Essayez de définir les paramètres de demande de capture suivants

     requestBuilder = camDevice .createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); requestBuilder.set(CaptureRequest.EDGE_MODE, CaptureRequest.EDGE_MODE_OFF); requestBuilder.set( CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE, CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE_ON); requestBuilder.set( CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE, CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE_OFF); requestBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE, CaptureRequest.NOISE_REDUCTION_MODE_OFF); requestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_CANCEL); requestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true); requestBuilder.set(CaptureRequest.CONTROL_AWB_LOCK, true); 

    Je ne suis pas sûr de la rapidité avec laquelle les informations sont disponibles dans CameraCaptureSession.CaptureCallback. Ce n'est pas avoir des données d'image, et il pourrait être appelé avant ou après ImageReader.OnImageAvailableListener. Essayez de mesurer le temps entre les appels ImageReader.OnImageAvailableListener. Et n'oubliez pas de lire les images et de les libérer, car les nouvelles images ne sont pas disponibles si le tampon est rempli et les images ne sont pas diffusées. Par exemple:

     private class imageAvailableListener implements ImageReader.OnImageAvailableListener { @Override public void onImageAvailable(ImageReader ir) { Log.i(TAG, "Time = " + System.currentTimeMillis()); Image im = ir.acquireNextImage(); im.close(); } } ImageReader mImageReader = ImageReader.newInstance(imageReaderWidth, imageReaderHeight, ImageFormat.YUV_420_888, 2); mImageReader.setOnImageAvailableListener( new imageAvailableListener(), null); 

    Basé sur cet article PcMag: http://www.pcmag.com/article2/0,2817,2428017,00.asp Le mode de rafale Nexus 5 vous permet de prendre 3 images par seconde. Donc obtenir beaucoup moins de 333 ms entre les photos est très peu probable.

    Avez-vous une source d'information qui suggère que l'explosion de Nexus 5 devrait être plus rapide?

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.