06
Фев

Домашнее видеонаблюдение

Написал Максим Крентовский в Исследования

Домашнее видеонаблюдение — тема не сколь широко распространенная, но весьма интересная с инженерной точки зрения, позволившая объединить имеющиеся знания в области практического применения. Разумеется, это решение ничуть не лучше готовых комплектов «камеры + NVR», не продающиеся в наше технологичное время разве что только в продуктовых магазинах, но при этом в систему можно заложить дополнительные функции, не предлагаемые стандартными решениями.
cam

Итак, приступим. Начнем с камер. Вот простейший тест, выполненный днем на трех камерах:

Простейшая 720p web-камера с ноутбука Asus Zenbook:

webcam

Как видим, качество картинки оставляет желать лучшего — узкий диапазон, цифровые шумы — и это при дневном освещении внутри комнаты (что будет в сумерках — представить несложно). Оно и понятно — web-камеры предназначены большей частью для видеочатов и отличной картинки от них ожидать не приходится. Кроме этого, для целей видеонаблюдения этот метод тоже будет весьма проблематичным, поскольку помимо камеры потребуется как минимум энкодер, способный производить захват с сенсора и кодировать поток привычным h.264-кодеком, что, в свою очередь является нетривиальной задачей для современных DIY-плат в случае использования аппаратных ускорителей (которые либо заточены на работу с сенсором с MIPI CSI/parallel интерфейсами на плате, либо отсутствуют как класс) или весьма требовательной по процессорным ресурсам в случае программного сжатия (на Raspberry Pi первой версии загрузка процессора стабильно держалась в районе 80-90%).

Картинка с Xiaomi Ant (домашней IP-камеры):

ant

В общем и целом картинка достаточно приличная, если не считать недостаточную глубину резкости, что устраняется подстройкой фокуса, впрочем, весьма нетривиальной, с частичным разбором всего устройства.
В сумерках камера включается в черно-белый режим. В комплекте есть возможность снимать/публиковать звук моно-качества, вполне достаточный для вычленения событий. Поток не требует перекодирования — т.е. уже в h.264/aac, отдаваемый по RTSP — и передается по Wi-Fi, что можно записать как в плюс, так и в минус камере (в том числе и за то, что привязка к точке доступа нетривиальная и требует как минимум смартфона с приложением). В общем и целом — отличное решение при бюджетной цене в 30-40 долларов.

Картинка с IP-камеры на чипе Hi3516 и сенсоре Sony IMX322:

sony

Как видим, картинка много лучше предыдущих вариантов, даже с учетом пересвета. Тут, надо отметить, что используется расширение 1080p в отличие от предыдущих, где максимум 720p. Так же отмечу широкий динамический диапазон сенсора — в сумерках камера «видит» лучше меня, хоть и с большим количеством цифровых шумов. К сожалению, на этом плюсы заканчиваются — камера требует Ethernet, 12В питания (не очень удобно), ощутимо греется с торцов платы и конфигурируется исключительно через ActiveX-плагин. Помимо этого для звука необходимо напаять микрофон, а вот качество звука оставляет желать лучшего, при этом в потоке он отдается несжатым, что сильно портит картину. Помимо всего, в камере присутствует баг, обнаруженный Антоном Федоровым, что слегка вставляет палки в колеса при просмотре (требуется форсированное использование TCP-протокола для RTSP) и серьезно — при ретрансляции. Оправдывает все это многообразие граблей цена — модуль стоит 35 долларов, что на 100 долларов меньше Nest Cam, обладающей, судя по описанию похожими характеристиками картинки при законченности уровня Xiaomi Ant.

Итак, с камерами определились. Теперь надо разобраться с видео-сервером, т.е. посредником, который будет хранить поток и ретранслировать его на компьютеры и мобильные устройства. Для этих целей задействуем обычную Raspberry Pi 2, аппаратных возможностей которой вполне хватит для перепаковки нескольких видеопотоков даже с учетом необходимости устранения RTSP-ошибки.

Возьмем Raspbian и установим следующие пакеты:

1
sudo apt-get install tmux gcc g++ librtmp-dev libssl-dev zlib1g-dev libpcre3-dev

Установим nginx-rtmp и ffmpeg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
wget http://ffmpeg.org/releases/ffmpeg-snapshot-git.tar.bz2
tar xf ffmpeg-snapshot-git.tar.bz2
cd ffmpeg
./configure --enable-nonfree --enable-librtmp
make
sudo make install
...
wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar xf nginx-1.8.0.tar.gz
git clone https://github.com/arut/nginx-rtmp-module.git
cd nginx-1.8.0
./configure --add-module=`pwd`/../nginx-rtmp-module
make
sudo make install

После чего достаточно скопировать файлы из репозитария rapi-nvr в корень прошивки. Если повнимательнее приглядеться в файлы, то можно увидеть, что там в комплекте идут следующие полезные штуки:

  • /etc/rc.local для запуска nginx-rtmp, сценариев ретрансляции потоков и демона зачистки
  • camfix.py — скрипт для перехвата и отключения бага RTSP (к сожалению, на RTSP+TCP nginx-rtmp очень неадекватно реагирует)
  • conv.sh — скрипт для перепаковки видео для архива (nginx-rtmp по умолчанию пишет на диск flv, что не всегда удобно для хранения, поэтому происходит перепаковка в mp4)
  • cleaner — программа, зачищающая старые файлы в архиве по мере заполнения. Простейший демон на Python.
  • конфигурация nginx-rtmp и пример web-интерфейса для камер (flash-проигрыватель с возможностью переключения на HLS для Apple-устройств)
  • примеры командных строк для ffmpeg для разных камер (cam0 и cam1)

Все вышеприведенное вполне позволяет получить из устройства простейший NVR. Для добавления камер достаточно прописать нужные IP-адреса и исправить index.html для их отображения в интерфейсе, архив доступен по суффиксу /srv к URL интерфейса.

Таким образом мы получаем комплект «камеры + NVR» по достаточно практичной цене, но позволяющий дальше развивать и усовершенствовать систему — например, добавить дополнительные датчики телеметрии, сделать отправку видеофайлов на сторонние сервера/в облако по ключевым событиям и т.д.