Timelapse на Raspberry Pi — ускоренное видео

Как сделать ускоренное видео на Raspberry Pi? Вопрос, ответ на который можно легко найти в интернете. Несмотря на это, мы решили ещё раз про это подробно написать, как всегда основываясь на личный опыт.

Предпосылки

Для чего вдруг становится нужно timelapse-видео? Вообще, есть мечта снять движение млечного пути по ночному небу. Да, это уже сто раз все делали, но хочется свой млечный путь, с блекджеком и звёздами. Но пока эта задача отложена, появилась другая, более насущная.

Дело в том, что в нашей лаборатории иногда происходят разного рода инциденты. То входную дверь кто-то не закроет, то инструмент странным образом прячется в немыслимые места, то ещё какая аномалия случится. Для того, чтобы пресекать подобное безобразие, мы решили установить у себя видеонаблюдение. По сути, требовалось сделать устройство, которое будет записывать всё происходящее в помещении, и сохранять видеофайл на флешку.

Решение

С выбором аппаратной платформы долго не думали. Поскольку у нас есть некоторое количество свободных Raspberry Pi — выбрали её. Малый размер, низкое энергопотребление, производительность соизмеримая с каким-нибудь Atom-устройством — что ещё нужно для простого сервера видеонаблюдения.

Помимо самой RPi, разумеется, потребовалась веб-камера. Поставили Logitech C110, которая раньше наблюдала за работой одного из наших 3D-принтеров.

Что касается программной части, то здесь выбор пал на уже известный проект mjpg-streamer. Это удобный пакет, очень известный в Linux-сообществе, который ранее использовался для трансляции видео с RPi в интернет в задаче создания телеуправляемого робота.

mjpg-streamer умеет как транслировать кадры в сеть, так и сохранять их в виде jpg-файлов. Получается, чтобы сделать ускоренное видео, нам нужно собрать все jpg-файлы, созданные за день, и склеить их в один видеофайл. Для склеивания нам понадобится приложение avconv.

Также, чтобы сделать процесс склейки видео автоматическим, воспользуемся стандартным планировщиком cron. Обо всём этом читаем ниже.

Установка и настройка

Итак, установим всё по порядку на RPi. Здесь нам понадобится консоль, например, стандартный LXTerminal.

1. Заходим в консоль и устанавливаем пакет libv4l-0, он нужен для mjpg-streamer

sudo apt-get install libv4l-0

2. Устанавливаем пакет mjpg-streamer-rpi

Можно скачать его через браузер по ссылке http://www.bobtech.ro/get?download=36:mjpg-streamer-rpi, а можно с помощью wget:

wget http://www.bobtech.ro/get?download=36:mjpg-streamer-rpi

Полученный wget-ом файл переименовываем:

mv get\?download\=36\:mjpg-streamer-rpi mjpg-streamer-rpi.tar.gz

Определимся с местом, где у нас будет лежать пакет. Рекомендуем папку /home/pi. Распаковываем наш архив в заданную папку:

tar -zxvf mjpg-streamer-rpi.tar.gz -C /home/pi/

3. Настраиваем автоматический запуск демона, который будет делать снимки каждые 5 секунд.

Открываем в редакторе файл /etc/init.d/rc.local, и в самом низу дописываем такую строку:

sudo su pi /home/pi/mjpg-streamer/mjpg_streamer -i "/home/pi/mjpg-streamer/input_uvc.so" -o "/home/pi/mjpg-streamer/output_file.so -f /home/pi/mjpg-streamer/images -d 5000"

Примечание

Как видно из команды, мы задали целевую папку для кадров: /home/pi/mjpg-streamer/images. Эту папку нужно предварительно создать. Также мы указали период съёмки — 5000 мс, что равно 5 секундам.

4. Создаём и настраиваем скрипт склейки

Теперь нам нужно как-то склеивать эти кадры. Как уже писали выше, для этих целей мы будем использовать приложение avconv.

Для начала установим пакет libav-tools, в котором живёт avconv:

sudo apt-get install libav-tools

Затем в папке /home/pi/mjpg-streamer создадим такой bash-скрипт:

#!/bin/bash

fname=$(date --rfc-3339=date)

i=0
for f in `ls -tr /home/pi/mjpg-streamer/images/*.jpg 2>/dev/null`
do
  newf=`printf %06d $i`.jpg
  echo $f "-->" $newf
  mv $f $newf
  i=$((i+1))
done
avconv -r 10 -i %06d.jpg -r 10 -vcodec mjpeg -qscale 1 /home/pi/mjpg-streamer/images/$fname.avi
rm *.jpg

Сохраним скрипт как make_avi.sh, и выдадим ему права на запуск от имени пользователя pi.

sudo chmod 744 ./make_avi.sh

Затем приступим к настройке планировщика.

5. Cron

Будем запускать сборку видео каждый день в 23:00. Для этого отредактируем таблицу Cron у текущего пользователя pi.

crontab -e

Совет

Записи планировщика имеют вид: минута час день месяц день_недели код_для_запуска

В нашем случае запись будет иметь вид:

00 23 * * * bash /home/pi/mjpg-streamer/make_avi.sh

Добавим эту строчку вниз файла, и сохранимся.

6. Запуск

После успешной установки всех компонентов остаётся только перезапустить RPi, чтобы все изменения вступили в силу.

Итоги

Ну вот и всё. Ставим камеру в подходящее для съёмки место.

Совет

Рекомендуем навесить на камеру fish-eye объектив, чтобы увеличить угол обзора.

Подключаем питание к RPi, и система видеонаблюдения готова!

Чтобы посмотреть видео, достаточно вынуть флешку, и вставить её в Linux-комп для проигрывания, например, в VLC. В случае Windows, имеет смысл настроить SSH-связь с RPi, чтобы сливать видео по локальной сети.

Примечание

В планах настроить автоматическое удаление устаревших видеофайлов, чтобы не засорять флешку.

Видео

Timelapse на Raspberry Pi. Один день из жизни лаборатории AlashEd.