2010-05-26 19 views

Répondre

0

Cela dépend absolument de ce que vous définissez comme « prendre une photo » - comme Nathan mentionné, lors de l'enregistrement vidéo (essentiellement une série d'images compressées et réduites), vous pouvez "prendre" une photo toutes les 30ms. Mais si vous définissez "prendre une photo" comme copier une image jpeg 5MP sur la carte SD, cela prendra probablement plus de temps.

Vous devez décrire explicitement ce que vous voulez dire quand vous dites "faites juste une boucle (pour prendre 1000 photos)", surtout quand vous vous plaignez d'erreurs.

En supposant que vous étendez l'interface Camera.PictureCallback, beaucoup de traitement se passe dans les coulisses avant de passer l'image (comme la compression jpeg, je crois). Avez-vous essayé de lancer un événement dans votre implémentation de onPictureTaken pour prendre une autre photo? Cela pourrait être un moyen sûr de faire et de tester ce que vous voulez. Sinon, si vous lancez une tonne de "prendre une photo" des événements, une sorte de débordement de tas pourrait se produire, je ne sais pas.

Edit: grosso modo, ce que je voulais dire:

public void onPictureTaken(
     final byte [] data, final android.hardware.Camera camera) { 
    saveDataToFile("/DCIM/tempjpeg.jpg", data); 
    camera.takePicture(null, null, this); 
} 

Appel takePicture dès que vous le pouvez - droit dans le rappel! N'UTILISEZ PAS CELA sans modification, car cela sera bouclé pour toujours. J'ai essayé ceci, et cela fonctionne pour quelques photos, alors est juste de cesser de répondre. Si vous l'arrêtez après deux photos, il semble prendre moins d'une seconde sur un Nexus One. Espère que ça aide.

+0

oui, je pense que vous avez raison, je l'ai testé et plus de photos que je prends, plus de temps qu'il faut pour capturer une autre image etc ... mauvaise chose je vais essayer avec l'appareil photo.PictureCallback cru puis de prendre en quelque sorte une autre image dans onPictureTaken (mais en fait je ne sais pas comment) – questioner

+0

fondamentalement je veux prendre environ 2 photos en 1 seconde avec onPictureTaken il fonctionne avec 1 image, tout à côté besoin de plus de temps J'ai juste besoin d'un tableau d'octets qui représentent les pixels de l'image parce que je veux l'envoyer immédiatement à l'ordinateur – questioner

+0

J'ai essayé d'utiliser votre méthode et il donne toujours les mêmes résultats. quand nous appelons camera.takePicture stopPreview(); est appelé et vous devez écrire camera.startPrewiew(); pour faire une autre image démarrant probablement prwiew prend du temps, que pensez-vous de la récupération des cadres en utilisant: | camera.setPreviewCallback (nouveau PreviewCallback() { \t onPreviewFrame public void (octet [] _data, _camera de l'appareil photo) {// TODO \t Faire quelque chose avec l'aperçu \t} \t.}); ? Cela peut fonctionner mieux – questioner

0

Cela dépend vraiment de l'appareil que vous utilisez en dehors des problèmes de logiciel. Je voudrais juste exécuter les tests sur le téléphone en prenant automatiquement un nombre fixe d'images (comme 1000), les chronométrer et trouver le temps moyen et l'écart-type de cela. Faire cela sur un certain nombre d'appareils et l'émulateur vous donnerait certainement une idée du temps nécessaire.

+0

au moment la seule façon de faire beaucoup de photos est d'utiliser minuterie (et là je tape après combien de milisec prochaine image devrait être prise) quand je viens de faire une boucle (pour prendre 1000 photos) puis erreur apparaît. Donc, il devrait probablement y avoir du retard. Mais j'ai testé cela sur seulement 1 appareil. – questioner

0

Eh bien, le droïde Motorola peut prendre des vidéos de 30fps, donc si vous avez besoin vraiment des images rapides, vous pourriez peut-être utiliser MediaRecorder

0
boolean isTakingPicture = false; 


public void onclick2takepic(View view) { 
     try { 
     if(!isTakingPicture) { 
      mCamera.takePicture(null, null, mPicture); 
      isTakingPicture = true; 
     }else{ 
      isTakingPicture=false; 
     } 
    }catch(Exception e){ 
     Toast.makeText(this,"cannot take picture: "+e.getMessage(),Toast.LENGTH_SHORT).show(); 
    } 
} 


    private Camera.PictureCallback mPicture = new Camera.PictureCallback(){ 
    @Override 
public void onPictureTaken(byte[] data, Camera camera){ 
     File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 
     if(pictureFile==null){ 
      Toast.makeText(getApplicationContext(),"error creating media file, check permissions",Toast.LENGTH_LONG).show(); 
      return; 
     } 
     try{ 
      FileOutputStream fos = new FileOutputStream(pictureFile); 
      fos.write(data); 
      fos.close(); 
     }catch(FileNotFoundException e){ 
      //Toast.makeText(this,"file not found: "+e.getMessage()).show(); 
     }catch(IOException e){ 
      //Toast.makeText(getApplicationContext(),"error accessing file: "+e.getMessage()).show(); 
     } 
     //isTakingPicture = false; 
     mCamera.startPreview(); 
     if(isTakingPicture) { 
      mCamera.takePicture(null, null, mPicture); 
     } 
    } 
}; 

Dans ce code il y a une récursion qui redémarre et prend aperçu image à nouveau tant que isTakingPicture = true; Activer et désactiver l'aperçu prend du temps, donc je ne peux pas obtenir plus de quelques images par seconde sur mes anciens téléphones. aimerait être en mesure de le faire pas par takePicture car il ne peut pas tirer sans prévisualiser mais avec mediaRecorder mais n'a aucune idée de comment encore