Программное создание MJPEG Time Lapse видео под Android

Это несколько переработанная копия моей статьи на habrahabr.ru. Если у вас нет аккаунта на «Хабре», но есть вопросы по описываемой программе, вы можете задать их здесь.

Давайте напишем программу для создания своих собственных фильмов в технике Time Lapse. Завораживающее видео, снятое в этой технике с борта МКС, можно посмотреть здесь, более доступный вариант, который можно повторить с помощью описываемой программы — здесь.

Программа имеет простой интерфейс и несложный принцип работы:
• пользователь задает периодичность снимков встроенной камерой (например, 10 с) и желаемую частоту кадров генерируемого видео (например, 25 кадров в секунду);
• после нажатия кнопки «Старт»  программа каждые 10 секунд делает фотографию и записывает jpg-файл на SD-карту;
• процедура повторяется до нажатия кнопки «Стоп» и «Создать видео», после чего последовательность фотографий превращается в видео файл формата Motion JPEG, который показывает отснятый материал в 250 раз (25 * 10) быстрее реальной скорости происходивших событий.

В программе два основных класса — MainActivity, занимающегося взаимодействием с пользователем и накоплением снимков и MJPEGGenerator, ответственного за превращение последовательности изображений в видео файл.

Класс MJPEGGenerator, взятый с code.google.com, был слегка переделан в связи с тем, что в Android Java отсутствует пакет java.awt.

Процедуры работы с камерой были преимущественно взяты из материала Работа с камерой в Android, где есть хорошее описание примененных решений, проблема «залипаний» камеры после лока/анлока Android-устройства была устранена благодаря stackoverflow.

Рассмотрим более подробно работу отдельных компонентов программы, не касающихся собственно камеры.

Для того, чтобы экран во время съемки не выключался, был применен механизм PowerManager.WakeLock:

Периодичность запуска камеры регулируется таймером:

Перед началом работы проверяется наличие SD-карты:

Данные, введенные пользователем, проходят предварительную обработку: запятые, введенные в качестве разделителя десятичных разрядов, заменяются на точку; проверяется ввод недопустимых не цифровых значений; значения введенного периода и частоты кадров проверяются на вхождение в допустимый диапазон:

В начале работы из папки программы удаляются все файла *.jpg, оставшиеся после предыдущего сеанса:

После съемки очередного кадра пользователю показывается оставшееся на карте место:

Собственно генерация видео:

MJPEGGenerator запускается со следующими параметрами:
videofile — название файла видео каждый раз берется новое, нумеруемое по маске TimeLapseMovieXXX.avi, чтобы сохранить файлы, отснятые ранее;
aviWidth, aviHeight — берется из свойств камеры;
fps — задается пользователем;
lastPicture — номер последней снятой фотографии.

Чтобы не подвешивать пользовательский интерфейс, генерация видео запускается в отдельном потоке AsyncTask, взаимодействующим с GUI через onProgressUpdate.

Содержимое ключевых файлов показано ниже.

MainActivity.java

MJPEGGenerator.java

activity_main.xml

AndroidManifest.xml

 

Добавить комментарий