Программное создание 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

 

Закладка Постоянная ссылка.

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

  • Несколько случайная, но довольно любопытная информация:

    При проектировании пикирующего бомбардировщика ТУ-2 (фото кликабельно) советским конструкторам пришлось решать целый комплекс инженерных задач. С одной стороны, при пикировании на цель самолет развивал слишком большую скорость, и поэтому во избежание разрушения аппарата его приходилось выводить из пике слишком высоко, примерно на высоте 1.5—2 км, что ухудшало точность поражения целей. С другой стороны, при пикировании набегающий поток воздуха заставляет все быстрее и быстрее вращаться винты самолета, что приводит к увеличению числа оборотов коленвала двигателя и резкому увеличению нагрузок на сам мотор, вплоть до разрушения. К счастью, КБ под руководством А. Туполева нашло ответы на оба вопроса. Для снижения скорости пикирования на самолет установили воздушные тормоза — отклоняемые щитки на передней части крыла. А со слишком высокими оборотами коленвала управились путем применения винтов с изменяемым шагом. Ну а потом был изобретен бомбоприцел, и развитие бомбардировочной авиации пошло совсем другим путем…