Подтвердить что ты не робот

Как можно быстрее сделать снимок с помощью Camera API на Android

Сценарий:

Мне нужно сделать снимок как можно быстрее и сохранить его на SD-карте. Было бы фантастически, если бы я мог сделать это примерно за 0,2 секунды, сняв фотографию и сохранив ее.

Что я сделал до сих пор:

Как обычно, я создал SurfaceView для обработки предварительного просмотра камеры и инициализации объекта камеры. Качество изображения не должно быть очень высоким, поэтому я не использую максимально возможное разрешение, а также не требуется автофокусировка. Я задал параметры следующим образом:

 Parameters parameters = camera.getParameters();
 parameters.set("jpeg-quality", 70);

 parameters.setPictureFormat(ImageFormat.JPEG);
 List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
 Size size = sizes.get(Integer.valueOf((sizes.size()-1)/2)); //choose a medium resolution
 parameters.setPictureSize(size.width, size.height);
 camera.setParameters(parameters);
 camera.setDisplayOrientation(90);

 List<Size> sizes2 = parameters.getSupportedPreviewSizes();
 Size size2 = sizes.get(0);

 parameters.setPreviewSize(size2.width, size2.height);
 camera.setPreviewDisplay(holder);
 camera.startPreview();

Я сохраняю изображение на SD-карте очень просто:

PictureCallback handlePictureStorage = new PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            FileOutputStream outStream = null;

            try {
                outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));
                outStream.write(data);
                outStream.close();       
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
            }
        }
    };

После нескольких тестов на моем Galaxy Nexus результат выглядит следующим образом:

  • Настройка размера изображения: wigth = 1600 height = 1200
  • Качество JPEG: 70, Формат изображения JPEG
  • Пожар снимать на: 00: 13: 23.603
  • Начало сохранения изображения на SD-карте: 00: 13: 23.956
  • Готовое сохранение изображения на SD-карте: 00: 13: 23.990

Это почти 0,4 секунды. Есть ли способ настроить параметры камеры еще больше, чтобы получить более высокую скорость? Разрешение в порядке, качество изображения также. Я знаю, что есть приложения на рынке, которые имеют 30 кадров в секунду, но я думаю, что они используют буферизацию для достижения этой скорости. Однако, как вы видите, самое большое время теряется при съемке, а не в сохранении карты. Было бы здорово, если бы я мог настроить это немного больше.

4b9b3361

Ответ 1

После того, как я немного тестировал несколько параметров, вывод заключается в том, что многое еще предстоит сделать. Вот некоторые параметры, которые я установил:

  //set color efects to none
 cameraParameters.setColorEffect(Camera.Parameters.EFFECT_NONE);

  //set antibanding to none
 if (cameraParameters.getAntibanding() != null) {
 cameraParameters.setAntibanding(Camera.Parameters.ANTIBANDING_OFF);
 }

 // set white ballance
 if (cameraParameters.getWhiteBalance() != null) {
 cameraParameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT);
 }

  //set flash
 if (cameraParameters.getFlashMode() != null) {
 cameraParameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
 }

  //set zoom
 if (cameraParameters.isZoomSupported()) {
 cameraParameters.setZoom(0);
 }

 //set focus mode
 cameraParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);

Однако лучше всего получить полный список параметров, поддерживаемых камерой, и попытаться настроить их. Чтобы получить строку, используйте метод сглаживания Camera.Parameters - http://developer.android.com/reference/android/hardware/Camera.Parameters.html#flatten()

Но для того, чтобы получить изображения очень быстро, я должен был использовать предварительный просмотр с буфером, и для каждого взятого кадра попытайтесь сохранить его на SD-карте в потоке. Качество изображения не фантастическое, но это начало.