Camera2 получает постоянный доступ к изображениям предварительного просмотра камеры

Я хочу расширить приложение от Camera1 до Camera2 в зависимости от API. Один из основных механизмов приложения состоит в том, чтобы делать предварительные снимки со скоростью около 20 изображений в секунду. С Camera1 я понял это, создав SurfaceView, добавив Callback на его держатель и после создания поверхности, получая доступ к фотографиям предварительного просмотра через периодические setOneShotPreviewCallbacks. Это было довольно легко и надежно.

Теперь, когда я изучал Camera2, я пришел «с конца» и смог преобразовать YUV420_888 в Bitmap (см.YUV420_888 для преобразования растровых изображений ). Однако сейчас я борюсь с «техникой захвата». Из примера Google я вижу, что вам нужно сделать "setRepeating" CaptureRequest с CameraDevice.TEMPLATE_PREVIEW для отображения предварительного просмотра, например, на поверхности. Это хорошо. Тем не менее, чтобы сделать реальное изображение, мне нужно сделать еще один запрос захвата с помощью (на этот раз) builder.addTarget (imageReader.getSurface ()). То есть данные будут доступны в методе onImageAvailable imageReader.

Проблема: создание captureRequest - довольно сложная операция, занимающая около 200 мс на моем устройстве. Поэтому использование запроса захвата (будь то с помощью шаблона STILL_CAPTUR или PREVIEW) может быть невозможным для захвата 20 изображений в секунду, как мне это нужно. Предложения, которые я нашел здесь для SO, в основном основаны на (образовательно умеренно эффективном) примере Google, который я не очень понимаю ...

Я чувствую, что решение должно состоять в том, чтобы кормить ImageReader непрерывным потоком изображений предварительного просмотра, которые можно выбирать оттуда с заданной частотой. Может кто-нибудь дать несколько советов о том, как это реализовать? Большое спасибо.

Ответы на вопрос(1)

Ваш ответ на вопрос