Насколько велик интервал между съемками в телефоне Android? - PullRequest
1 голос
/ 26 мая 2010

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

Кто-нибудь из вас знает это время?

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

Ответы [ 4 ]

0 голосов
/ 11 сентября 2015
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, но пока не знаю, как это сделать

0 голосов
/ 26 мая 2010

Что ж, Motorola Droid может снимать видео со скоростью 30 кадров в секунду, поэтому, если вам нужны действительно быстрые изображения, возможно, вы могли бы использовать MediaRecorder

0 голосов
/ 27 мая 2010

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

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

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

Редактировать: Грубо говоря, это то, что я имел в виду:

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 голосов
/ 26 мая 2010

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

...