С помощью Android SDK достаточно просто выполнить следующие шаги:
- Снимайте кадры предварительного просмотра с камеры в виде растровых данных.
Camera.PreviewCallback
вернет byte[]
данных, представляющих кадр, в нескольких возможных форматах изображения.
- Изменить данные пикселей. Поскольку данные возвращаются в виде необработанных байтов, внесение корректировок в эти данные относительно просто ... трудность здесь заключается в применении алгоритма для конкретной обработки изображений, которую вы хотите выполнить. Нет встроенных эффектов (до 4.0), которые можно было бы просто применить к изображениям, поэтому вам придется написать свои собственные.
- Также возможно декодировать данные в
Bitmap
объект, чтобы упростить работу с пикселями. В версии 2.2 у вас есть возможность использовать NDK и jnigraphics для работы с пикселями растрового изображения в собственном коде, что значительно быстрее, чем на уровне Java.
- Возьмите содержимое вашего результирующего
Bitmap
и отобразите его. Для быстро движущихся данных вы бы хотели отобразить это на SurfaceView
; используя методы lockCanvas()
и unlockCanvasAndPost()
, доступные в SurfaceHolder
, который содержит это представление.
Если это все, что вы хотите сделать, вы можете сделать это без особых трудностей. Однако это не то же самое, что захват видео. В настоящее время Android не предоставляет возможности для потоковой передачи кадров в контейнер закодированного видео (MPEG4, 3GP и т. Д.) В режиме реального времени. Его возможности захвата видео тесно связаны с MediaRecorder
, который контролирует процесс от захвата кадра до записи закодированного видео. Вам потребуется библиотека третьей части, такая как FFMPEG (которая была создана и запущена с использованием слоя NDK несколько раз в приложениях Android), чтобы помочь в процессе кодирования ваших измененных кадров.
Я знаю, что у вас есть цель 2.2, но Android 4.0 здесь дает некоторое облегчение, так как они выпустили новую версию NDK, которая позволяет больше узнать о том, что происходит при чтении данных изображения из потока перед передачей уровень представления. Тем не менее, я не провел с ним достаточно времени, чтобы узнать, можно ли его рекомендовать для вашей ситуации.