Как сделать ускоренное видео на Raspberry Pi? Вопрос, ответ на который можно легко найти в интернете. Несмотря на это, я решил ещё раз про это подробно написать, как всегда основываясь на свой личный опыт.
Предпосылки
Для чего мне стало вдруг нужно timelaps видео? Вообще, есть мечта снять движение млечного пути по ночному небу. Да, это уже сто раз все делали, но мне хочется свой млечный путь, с блекджеком и звездами. Но пока я не добрался до этой задачи, появилась другая, более насущная.
Дело в том, что в нашем хакспейсе MakeItLab, иногда происходят разного рода инциденты. То входную дверь кто-то не закроет, то инструмент странным образом прячется в немыслимые места, то ещё какая аномалия случится. Для того, чтобы пресекать подобное безобразие, мы решили установить у себя видео-наблюдение. По сути, требовалось сделать устройство, которое будет записывать всё происходящее в помещении, и сохранять видео-файл на флешку.
Решение
С выбором аппаратной платформы долго не думали. Поскольку у нас есть некоторое количество свободных Raspberry Pi — выбрали её. Малый размер, низкое энергопотребление, производительность соизмеримая с каким нибудь Atom-устройством — что ещё нужно для простого сервера видеонаблюдения.
Помимо самой RPi, разумеется, потребовалась веб-камера. Поставили logitech C110, которая раньше наблюдала за работой одного из наших 3D-принтеров.
Что касается программной части, то здесь выбор пал на уже известный проект mjpg-streamer. Собственно, уже довольно давно я писал о том, как транслировать видео c RPi в интернет. Задача была связана с созданием телеуправляемого робота. Тогда я и нашел этот удобный пакет mjpg-streamer, очень известный в Linux сообществе.
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, чтобы сливать видео по локальной сети.
В планах настроить автоматическое удаление устаревших видеофайлов, чтобы не засорять флешку.