2015-02-17 2 views
1

Мне нужно ускорить захват API камеры2. Я попытался создать проект «android-Camera2Basic» из образцов Google. Для запроса захвата по умолчанию из примера:Android camera2 speed-up

if (null == activity || null == mCameraDevice) { 
      return; 
     } 
     // This is the CaptureRequest.Builder that we use to take a picture. 
     final CaptureRequest.Builder captureBuilder = 
       mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
     captureBuilder.addTarget(mImageReader.getSurface()); 

     // Use the same AE and AF modes as the preview. 
     captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, 
       CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 
     captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, 
       CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); 

     // Orientation 
     int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); 
     captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation)); 

     CameraCaptureSession.CaptureCallback CaptureCallback 
       = new CameraCaptureSession.CaptureCallback() { 

      @Override 
      public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, 
              TotalCaptureResult result) { 
       showToast("Saved: " + mFile); 
       unlockFocus(); 
      } 
     }; 

     mCaptureSession.stopRepeating(); 
     mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null); 

Он принимает 200-300ms от отправки запроса

mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null); 

И получить результат в

onImageAvailable(ImageReader reader) 

Можно ли сократить это время? Я попробовал установить различные параметры для запроса на захват, такие как TEMPLATE_ZERO_SHUTTER_LAG, NOISE_REDUCTION_MODE_OFF, EDGE_MODE_OFF и т. Д. Но это не имеет никакого эффекта. Если я попытаюсь захватить взрыв, тогда все изображения, кроме первого, будут проходить очень быстро, не более, чем в 30-40 мс. Как уменьшить время захвата для первого изображения?

+0

Я уверен, что начальное время - это аппаратное ограничение, и вы не сможете уменьшить его. Это именно то, как долго требуется, чтобы запрос прошел через контроллер датчика, датчик захватил его, необработанные данные получили декодирование и результаты отправлены обратно в ваше приложение. – Budius

+0

Я думаю. Но при всплеске кадров съемки захватываются очень быстро, кроме первого. Кроме того, я старался не останавливать предварительный захват, поэтому камера должна быть «горячей», и не нужно начинать все параметры. Но результат тот же. И я думаю, что опция ZERO_SHUTTER_LAG не может иметь одинаковых результатов. –

+0

@MaximMetelskiy Как вы получили всплеск так быстро? Мои снимки разнесены на расстояние 200-300 мс даже при использовании captureBurst. Я могу просто задать новый вопрос, если хотите. – acheroncaptain

ответ

4

отвечая на ваш комментарий, но сделать это в надлежащий ответ:

Если вы проверить эти слайды из Samsung dev. conference на слайде # 22 он показывает модель Camera2. Как вы можете видеть, там уже несколько очередей:

  • В ожидании очереди Запрос
  • В очереди захвата полета
  • очереди вывода изображения на поверхность, показывая камеры предварительного
  • и обратный вызов в onCaptureComplete

Camera2 API core operation model

, что объясняет, почему первый захват замедленное w, но в пакетном режиме следующие изображения поступают очень быстро. Запросы и обработка поставлены в очередь, а первый занимает 300 мс, чтобы вернуться на обратный вызов, но следующий уже «прямо за ним».

Если вас интересует новый API (и кто бы не был, камера2 поразительна), вы также можете проверить full video from the Samsung Dev. conference on YouTube. И the official docs. У Лота хорошая информация об этих.