Android: доступ к кадровым кадрам без предварительного просмотра

В соответствии с документами андроидной камеры со стороны Java SDK кадры предварительного просмотра камеры должны быть снабжены (видимой и активной) поверхностью для рисования, чтобы получить доступ к данным кадра. Я связал несколько вещей, с которыми я столкнулся здесь (я новичок, у которого есть 2 гиперссылки), но я просмотрел множество документации по различным вещам, прежде чем завершать свой собственный вопрос здесь, на SO.

Мои проблемы:

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

b) Да, я видел это: Съемка с камеры без предварительного просмотра.

Однако это диктует, что приложения, использующие эту библиотеку, должны вставлять это (по-видимому) произвольное представление в свой макет приложения, который должен быть видимым все время (они не могут переключать макеты, изменять видимость родительских контейнеров или использовать субактивность) в течение жизненного цикла приложения.

Фактически, мои потребности похожи на этот плакат, за исключением того, что я хочу непрерывный поток данных предварительного просмотра в режиме реального времени, а не захват, сохраненный для изображения на диске, Следовательно, PictureCallback работает для него вместе с вызовом myCamera.takePicture. По понятным причинам, запись непрерывных захватов на диск не является решением для меня, поэтому это не будет работать в моем случае. myCamera.takePicture также намного медленнее, чем получение кадров предварительного просмотра.

c) Я начал работать с NDK и получил очень хорошее представление об этом. Однако, согласно этот доступ к данным камеры через native просто не поддерживается или не рекомендуется, а также огромная стычка за совместимость с устройством.

Если это устарело, и есть твердые маршруты NDK для получения данных с камер с Android-устройств, я не смог их найти, поэтому, если бы вы могли указать на них, это было бы здорово.

d) Я хочу сделать эту библиотеку доступной из таких инструментов, как Unity (в виде плагина единства), для чего я хочу просто скомпилировать ее в JAR (или .so для native) и ожидать ее для работы с приложениями Android, которые импортируют библиотеку таким образом, чтобы они могли использовать камеру без конкретных конфигураций интерфейса/макета, необходимых разработчику приложения.

Контекст:

Я хочу создать библиотеку обработки видения для использования в приложениях для Android и не хочу ограничивать приложения, использующие библиотеку, для использования определенных макетов приложений и нарисовать определенные виды на экране, чтобы используйте результаты обработки зрения - для очень простого примера, если приложение хочет использовать мою библиотеку, чтобы получить средний цвет того, что видит камера, и хочет покрасить изображение на экране этого цвета.

Независимо от предложений, которые я могу получить по любому из пунктов, которые у меня есть, будет очень полезно. Большое спасибо за ваше время!

Ответ 1

Я совсем забыл, что у меня был этот вопрос. 2 года и несколько версий Android SDK, у нас есть рабочая система.

Мы используем расширенный SurfaceTexture, cameraSurface со ссылкой на нужную камеру. Используя cameraSurface SurfaceTexture, мы вызываем

mCamera.setPreviewTexture(mSurfaceTexture);
mCamera.startPreview();

Затем переопределите текущую активную камеру previewCallback из вашей активности или там, где она вам нужна.

mCamera.setPreviewCallback(new PreviewCallback() {

     public void onPreviewFrame(final byte[] data, final Camera camera) {
         // Process the contents of byte for whatever you need
     }
});

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

Если я найду время, я постараюсь отбросить рабочую демонстрацию на баребонах.

Изменить: связанный с SDK SDK больше не доступен. Вы можете запросить его через контактную страницу BitGym.

Ответ 2

Невозможно обойти SurfaceView для предварительного просмотра изображения. Вы можете делегировать ответственность за захват byte[] приложениям, реализующим вашу библиотеку, что позволит им использовать вашу библиотеку не только для изображений с камеры, но и для изображений, которые уже были сделаны.