22
Апр

Трансляция видео с камеры на сайт

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

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

Понятно, что эта задачка достаточно простая в теории, но практика не даст расслабится. Исходный план был таков: берем SoC-устройство с камерой, подключаем к установленному WiFi-роутеру, транслируем RTMP-поток на VPS с сайтом, где nginx-rtmp спокойно раздаст поток всем желающим. Реальность оказалась много интереснее…

10475049_1438647743041388_1655424735_n

Во-первых, у всех имеющихся в наличии SoC плат только две оказалось можно использовать для подобных вещей без проблем и заморочек — это Raspberry Pi и Виртурилка. Остальное либо имело проблемы с подключением сенсоров, либо с аппаратным энкодером h.264 (без которого даже мощные процессоры могли функционировать только очень печально), либо с качеством картинки. Впрочем, это тема отдельной большой статьи, которую я, надеюсь, все-таки когда-нибудь напишу. Т.н.м. все имеющиеся в распоряжении комплекты Малины и Виртурилки были необходимы мне для экспериментов, поэтому строить решение на них было не вариантом.

Во-вторых, USB-камеру использовать также очень не хотелось по банальным причинам — качество картинки в динамике там получалось только в разрешении 640×480, а чтобы получить хотя бы 720p требовалось забирать MJPEG-поток, что, опять же, убивало производительность.

Тут я вспомнил про модули IP-камер на DM365 (который стоит на Виртурилке). Эти модули представляют собой пару плат, на одной из которых напаян сенсор и установлена оптика, на другой, соединенной с первой шлейфом, расположен тот же SoC с обвязкой и контактные площадки. Будучи поставленным в корпус, такой модуль приобретает вид законченной IP-камеры, которую легко можно использовать для наблюдения. Выбранный модуль давал достойную по цветам картинку даже при посредственном освещении и это было как минимум хорошо. На скорую руку из коробочки от Polaroid Cude был заколхожен корпус, результат можно посмотреть на картинке выше — вот так это безобразие и смотрится. Впрочем, стоять оно предполагалось высоко и в нанесении непоправимой порчи внешнему антуражу магазина не задействоваться.

Окей, едем дальше. С камеры поток можно снять в первую очередь по RTSP, но это будет честный 720p. Т.е. как минимум необходим рестример — устройство, которое возьмет поток, перепакует RTSP в RTMP и пошлет на сервер. Также не мешало бы протянуть какой-либо простой VPN до сервера, исключительно с целью, чтобы злобные админы точки присутствия не распознали поток с камеры простым анализом пакетов и не зарубили его на корню. Забегая вперед, скажу, что это было правильным ходом, потому что админы хоть поток и не распознали, но зато очень удачно зарубили все порты кроме традиционных, в том числе и RTMP-шный. Т.е. были все-таки злобные, хоть и не очень, и перевод приемника VPN-а на порт 8080 оказался вполне работоспособным.

Рестример решено было делать на базе остатков свистка MK802 с процессором Allwinner A10, на котором уже был установлен Debian с ffmpeg для перекодирования и tinc для VPN, а для сопряжения с камерой потребовался USB-Ethernet свисток. В результате получился примерно следующий колхоз:

10848155_374386996073693_1878058281_n

Омрачало всю машинерию то, что камера питалась от БП 12В, а рестример — от 5В, но монтаж предполагал скрыть оба блока питания и все многообразие проводов, так что это стало не более чем раздражающей мелочью. Другой такой мелочью оказалось полная неконфигурабельность модуля камеры — залитая в него прошивка не позволяла изменить ни настройки OSD, ни параметры IP, ничего вообще, а товарищи китайцы горделиво молчали во ответ на вопросы «Какого лешего?» с моей стороны. Так что пришлось выставлять напоказ камеру с паразитными часами по Шеньженю и прочими надписями. Еще одна мелочь — RTSP-поток, генерируемый камерой по умолчанию оказался битым, а правильный URL, доступный через ONVIF-интерфейс посмотреть, увы, сразу не догадался. Проблема была в давнем глюке, описанным коллегой datacompboy — В результате на рестримере пришлось городить следующую конструкцию — был взят исходный корректирующий скрипт, в котором произведена санация отладочной выдачи, а весь полезный выхлоп отдавался в стандартный поток, который подхватывал ffmpeg и пересылал на nginx-rtmp.

В результате итоговый путь видео напоминал полосу препятствий из костылей и подпорок — видео захватывалось и кодировалось в модуле камеры, паковалось в RTSP и передавалось по Ethernet в A10, где его подхватывал python-скрипт, очищал от паразитных эффектов live555-бага и отдавал в ffmpeg, который перепаковывал поток и отдавал его поверх VPN на сервер-ретранслятор. Поскольку A10 имеет только один USB-интерфейс, то подключение к роутеру производилось по WiFi, а дальше уже шел провод бизнес-центра. В общем, все весело.

Отдельный нюанс, который следует упомянуть — плеер на сайте. В его качестве был взят типовой плеер OSMF Strobe Media Playback, имеющий достаточно богатые возможности по конфигурации, но при этом не содержащий лишних элементов управления и водяных знаков. Дополнительно был написан короткий сценарий для воспроизведения видео на iPhone/iPad, благо что nginx-rtmp умеет сам перепаковывать в HLS.

Надо отметить, что вся комплектация успешно пережила пару месяцев эксплуатации, обеспечивая не только неплохую картинку, но и оставаясь практически незаметной для посетителей магазина.

Эльдар Амантай
2015-04-24 07:56:49
На одном проекте для наблюдения в детском саду и стриминга на сайт тоже использовали nginx-rtmp + несколько IP камер. Получилось не плохо, но в бой не пошло.
Anton Tenyakov
2015-09-22 12:16:50
А возможно ли было пустить видео c SoC по RTP, а на VPS сделать loopback и завести на nginx-rtmp или Wowza Cloud?
Максим Крентовский
2015-09-22 14:01:41
Напрямую с камеры? В теории, при наличии SDK можно вещать сразу на RTMP-сервер, мощности позволяют. Беда в том, что это задача более трудозатратная, нежели поставить промежуточный перекодировщик.