2010-05-26 6 views
1

Мне интересно, как быстро я могу фотографировать один за другим с неожиданными неожиданностями с телефона (например, fx: 'force close;)Насколько велика интервал между фотографиями на Android-телефоне?

Знаете ли вы, что это время?

Я знаю, что 500 milisec - безопасное время. Когда я экспериментирую с 100, 200, 300 milisec, есть ошибка, но кто знает, возможно, я делаю это неправильно.

ответ

0

Это абсолютно зависит от того, что вы определяете как «сфотографировать» - как уже упоминалось Nathan, при записи видео (в основном серия уменьшенных, сжатых изображений), вы можете «взять» изображение каждые 30 мс. Но если вы определите «сделать снимок» как копирование 5MP jpeg-изображения на SD-карту, это, вероятно, займет больше времени.

Вы должны явно описать, что вы имеете в виду, когда говорите «просто сделайте цикл (чтобы сделать 1000 снимков)», особенно если вы жалуетесь на ошибки.

Предполагая, что вы расширяете интерфейс Camera.PictureCallback, много обработки идет за кулисами, прежде чем вы пройдете изображение (например, jpeg compression, я считаю). Пробовали ли вы сделать событие внутри своей реализации onPictureTaken, чтобы сделать еще одно изображение? Это может быть безопасный способ делать и тестировать то, что вы хотите. В противном случае, если вы отпустите тонну событий «сделайте снимок», может произойти какое-то переполнение кучи, я не знаю.

Edit: Грубо говоря, это то, что я имел в виду:

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

Вызов takePicture как только можно - прямо в обратный вызов! НЕ ИСПОЛЬЗУЙТЕ ЭТО без изменений, так как это будет работать навсегда. Я пробовал это, и он работает на пару фото, а затем просто перестает отвечать. Если вы остановите его после двух фото, он, кажется, займет меньше секунды на Nexus One. Надеюсь, что это поможет.

+0

Да, я думаю, что вы правы, я тестировал его и больше фотографий, которые я принимаю, больше времени, чтобы захватить другую картинку и т. Д. ... Я попробую с камерой.PictureCallback сырье , а затем принимать как-то другую картину в onPictureTaken (но на самом деле я не знаю, как) – questioner

+0

в основном я хочу, чтобы занять около 2 фотографий в 1 секунду с onPictureTaken он работает с 1 изображением, любой следующими нужно больше времени Мне нужно просто массив байтов, представляющих пиксели изображений, потому что я хочу отправить их немедленно на компьютер – questioner

+0

Я попытался использовать ваш метод, и он по-прежнему дает те же результаты. когда мы вызываем camera.takePicture stopPreview(); вызывается, и вы должны написать camera.startPrewiew(); чтобы сделать другое изображение Вероятно, начиная с prwiew требуется время, что вы думаете об извлечении кадров, используя: | camera.setPreviewCallback (новый PreviewCallback() { \t общественного недействительными onPreviewFrame (байт [] _data, камера _camera) { \t // TODO Сделайте что-нибудь с изображением предварительного просмотра \t} \t.}); ? Это может работать лучше – questioner

0

Это действительно зависит от устройства, которое вы используете, фактически, помимо программных проблем. Я просто запускал тесты на телефоне, автоматически беря фиксированное количество изображений (например, 1000), определяя их и находим среднее время и стандартное отклонение от этого. Выполнение этого на нескольких устройствах и эмуляторе определенно даст вам представление о том, сколько времени оно действительно занимает.

+0

на мгновение единственный способ сделать много снимков - использовать таймер (и там я набираю после сколько milisec следует сделать следующим образом) , когда я просто делаю цикл (чтобы сделать 1000 снимков), появляется ошибка. Поэтому, вероятно, должна быть какая-то задержка. Но я тестировал это только на одном устройстве. – questioner

0

Ну дроид Motorola может занять 30 кадров в секунду видео, так что если вам нужно действительно быстрые изображения, может быть, вы могли бы использовать 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); 
     } 
    } 
}; 

В этом коде есть рекурсия, что перезапускает предварительный просмотр и фотографирует снова, пока isTakingPicture = TRUE; Включение и выключение предварительного просмотра занимает много времени, поэтому я не могу получить больше, чем несколько фотографий в секунду на старых телефонах. хотел бы сделать это не через takePicture, так как он не может снимать без предварительного просмотра, но с mediaRecorder, но понятия не имею, как еще