Создавая проект, мы перепробовали много моделей внешних видеокамер (фиксированных, поворотных, мобильных), дорабатывая и приспосабливая их под наши нужды. Перепробовали несколько серверных решений, доводя их до ума вместе с разработчиками. Сами написали мобильные приложения для Android и iOS. Проект получился очень непростым, но мы постепенно отработали каждый элемент системы до состояния высокой эффективности. Развитие продолжается, однако уже сейчас есть что рассказать.
Это первая, обзорная статья. В ней мы расскажем о том, как запускали и развивали этот проект, из чего состоит техническое решение, как установить веб-камеру в клетке у льва (спойлер — договориться со львом), и зачем люди со всей России смотрят на Сочи через наш сайт. Если этот пост покажется интересным, мы можем рассказать о проекте более детально.
С технической стороны проект Сочи.Камера разбивается на три части:
1) снять изображение;
2) передать его на сервер видео трансляции;
3) показать стрим на сайте.
И всё это в «прямом эфире».
Пойдём последовательно.
Камеры.
Камеры на сети стоят разные. За почти 10 лет перепробовали многие модели, часть из протестированных так и стоят на сети. Камеры унифицированные, стандартные, протокол, который мы используем — RTSP, поддерживается практически каждой типовой моделью. Стоимость камер сильно упала с 2008 года, а качество изображения сильно выросло. Тогда простая статичная камера обходилась в сумму порядка 40 тысяч рублей, сегодня за те же деньги можно купить поворотную Full HD с возможностью «патрулирования по точкам», поставить её на вышке, и она будет давать динамичное изображение. Обычная же статичная камера сегодня стоит всего 5-7 тысяч (не забывайте про скидки).
Качество изображения с современных камер – практически телевизионное, совсем не то изображение в веб-камере, к которому мы все привыкли – маленький тёмный квадрат с частотой 1 кадр в секунду.
В последнее время остановились на паре моделей: Hikvision goo.gl/k8gkTy
и SNR goo.gl/dUqNxY
Они малошумные, с хорошим эффектом ночной съемки за счет современной матрицы.
Каждая камера отдаёт два потока: Full HD (скорость 4-6 Мбит/сек) и SD (512 Кбит/сек), на сайте есть переключатели HD/SD. Это делается для того, чтобы пользователи с не быстрым интернетом могли включить щадящий SD-режим. Он же используется у нас в мобильных приложениях, потому что на маленьком экране разница между Full HD и SD практически незаметна. Конечно же, на рынке представлено множество камер с разрешением выше Full HD, например 4Мп. Мы пробовали их использовать, но практика показала непригодность таких разрешений для онлайн-трансляций в интернете. Во-первых, не каждый интернет-канал такое передаст без потерь, и не каждое клиентское устройство сможет безболезненно этот поток вывести на экран. В результате трансляция может идти с рывками и артефактами, всё-таки интернет – это не локальная сеть. Ну и в довершение оказалось, что подавляющее большинство пользователей смотрят камеры в оконном, а не fullscreen режиме, то есть на выходе разница в битрейтах и разрешениях им вообще не видна. В итоге даже 4-мегапиксельные камеры мы перевели в режим 2Мп 1920х1080. Что касается программного обеспечения, то в самих камерах стандартная заводская прошивка, как правило, мы ничего там не меняем.
Сейчас в общем доступе порядка 318 камер. Запись ведётся на ~ 115-120 камер, которые относятся к дорожной обстановке. Запись нужна из-за необходимости разбора ДТП, что происходит довольно часто. Мы не записываем камеры, которые смотрят на природу, на закаты, на горы и так далее. Сервера записи — дорогой ресурс, зря его мы стараемся не расходовать.
Насчет приватности — камеры установлены так, чтобы лица не читались. Мы ставим панорамные камеры, чтобы было видно общую сцену, например, желтенькая машинка бьет синенькую, светофор горит там такой-то, не более того. Тем не менее ГИБДД и полиция обращаются часто, каждую неделю и даже, бывает, каждый день: просят показать записи.
Монтаж и обслуживание камер делаем через подрядчиков. При этом, если проблемы и бывают, то от слишком точного следования инструкциям. Приходится делать больше, чем по инструкции, учитывать, например, перепады давления и температуры. В процессе работы появились свои хитрости, например, соединение Ethernet-кабеля внутри корпуса камеры, а не в монтажной коробке или штатном соединительном «бочонке». Изолировать веб-камеры приходится гораздо серьёзней по сравнению со штатными средствами, чтобы они несколько лет спокойно работали без попадания влаги внутрь.
За размещение камер ничего не платим, это момент принципиальный, так как наш проект некоммерческий — изображение идёт в открытый доступ, мы ничего с него не зарабатываем. Так что, если кто не хочет бесплатно размещать, там не размещаем. В городе много красивых мест и много желающих поставить наши камеры. Владельцы зданий довольно охотно дают разрешение на установку, просто потому что мы на камере даем рекламу этих заведений бесплатно. Посещаемость у нас достаточно высокая для регионального сайта, свыше 500 000 человек ежемесячно, мы конкурируем с большими новостными местными порталами. Так что проблема скорее подать канал к интересному месту, чем собственно поставить камеру.
В целом, после того, как мы нашли оптимальные решения для разных ситуаций установки, камеры – это где-то 10% того, из чего состоит проект Сочи.Камера. Главное не в них, а скорее в каналах передачи видео и программном обеспечении для трансляции на сайте.
Каналы передачи видео.
«Бизнес-Связь» – интернет-провайдер, оператор связи, у нас своя сеть по городу, большое количество узлов. Так что нам не надо арендовать никаких каналов для передачи видео, ни «последнюю милю», ни магистральные каналы, ни доступ в интернет — у нас всё уже есть.
Потребители наших услуг – это организации и физические лица. Если смотреть на профиль их интернет-трафика, то там, в основном, трафик входящий, так как стандартный пользователь, как правило, трафик потребляет (скачивает) и очень мало генерирует. В среднем, соотношение входящего к абоненту трафика к исходящему – это 10 к 1. Каналы, которые мы арендуем/покупаем для предоставления услуг интернет у магистральных операторов, синхронные, в них скорость входящая и исходящая одинаковые. Так что обратный (исходящий канал), как правило, у интернет-провайдеров вроде нас – полупустой. Эта ситуация характерна для большинства операторов, работающих с людьми. В дата-центрах хостинг-провайдеров и соцсетей ситуация противоположная, там в основном исходящий трафик, но это не наш случай.
В итоге получается, что сбор видео с камер и его трансляция в интернет, с точки зрения затрат на передачу трафика, нам почти ничего не стоит. При этом каналы нужны серьёзные, ведь статичная камера даёт примерно 4 Мбит/сек, а поворотная — до 10 Мбит/сек в момент смены ракурса.
Умножьте это на количество одновременных потребителей, а это 2 000 и более в дневное время. Предположим, что сторонняя организация, не оператор связи, захочет создать проект наподобие Сочи.Камер. В этом случае весь необходимый ресурс нужно будет арендовать у связистов, а по нынешним ценах это влетит в хорошую копеечку. А вот если вы оператор связи – то и флаг вам в руки.
Но сложности с организацией каналов связи всё-таки иногда есть. Это связано с тем, что там, где каналы связи присутствуют, то есть в центре города в основном, смотреть уже почти нечего. А там, где интересно, каналов связи близко нет и их приходится как-то организовывать, выделять технику, расходные материалы, людские ресурсы. Например, сейчас организовываем связь к норе енота в лесу.
Программное обеспечение для видеотрансляции.
Мы начинали наш проект в 2008-2009, когда не было каких-либо образцов, которые можно было просто взять и скопировать. Тогда было много агрегаторов веб-камер, которые искали их везде, где только можно, и представляли в одном каталоге как якобы свои. Но комплексных, готовых решений не было. Для приёма такого большого количества камер и раздачи многим людям на разные устройства нужен надёжный и стабильный софт. Так что мы начали всё делать сами, это было несколько лет разработки с нуля, начиная от дизайна, вёрстки и заканчивая программной архитектурой. Ни у кого не копировали, перепробовали пять версий движка — от примитивного LinuxDVR на mjpeg, до Red 5, ffmpeg+nginx, Wowza. От последней, кстати, отказались не по техническим причинам, а из-за изменений лицензионных условий при переходе на новую версию и отсутствия lifetime-лицензии в новой политике американского разработчика. То есть они захотели получать деньги ежемесячно, исходя из фактической нагрузки. А то, что проект некоммерческий – никого там не волновало.
В процессе разработки и развития сервиса мы вышли на компанию «Эрливидео», разрабатывающую медиасервер Flussonic. Команда проекта из Москвы, и с ней легко было найти общий язык, в целом хорошо себя зарекомендовала при решении нетривиальных задач. Нельзя сказать, что всё всегда было гладко, вылезали и косяки, и грабли. НО. Когда видишь у разработчика желание улучшать свой продукт, выслушивать и учитывать замечания заказчика и видишь реальные результаты такого взаимодействия после очередного обновления – это дорогого стоит.
Flussonic Media Server — это видеостриминговая серверная платформа. С её помощью можно организовать захват любых видеопотоков, запись видео в архив и раздачу клиентам по различным протоколам и на любые устройства, как в режиме реального времени, так и по запросу. Проигрывание доступно в виде бесконечной ленты, которую можно просмотреть с любого момента. Раздача может идти по протоколам RTMP, RTSP, HLS, HDS, HTTP MPEG-TS, DASH и WebRTC. Также, Flussonic умеет транскодировать видео, изменяя кодек и параметры видео. В списке поддерживаемых кодеков — Н.264, Н.265, MPEG-2, AAC, AC3, MP3, VP6, Speex и G711a/u. Платформа умеет собирать кластеры из серверов, захватывать более 1600 потоков и распределять сотни тысяч одновременных подключений. Для управления и мониторинга активности и нагрузки можно использовать как встроенные инструменты и веб-интерфейс, так и HTTP API.
С камер мы собираем потоки в стандартном RTSP. Раздавали до недавнего времени в основном DASH для флеш-плееров, UDP Multicast для внутренней сети и HLS для мобильных приложений. Последние несколько лет периодически анонсировались HTML5-революции и «похороны» Adobe Flash, поэтому мы вынуждены были использовать целую конструкцию, «скармливающую» нужный тип плеера и стрима в зависимости от браузера и ОС клиента. Несмотря на шумиху вокруг HTML5, многие популярные браузеры очень коряво отрабатывали тег video, когда дело касалось лайв-трансляций. В отличие, скажем, от проигрывания предзаписанного видео, которое достаточно стабильно работало с момента анонсирования HTML5.
Сейчас можно констатировать, что «браузерная турбулентность» закончилась и мы перешли на нативное html5 вещание в браузерах, полностью отказавшись от Flash плагина. Таким образом, «на раздаче» у нас теперь только HLS и Multicast.
Для своих абонентов, пользующихся IPTV по мультикасту, мы сделали трансляцию этих камер в телевизионную сеть, то есть они видят все веб-камеры как отдельные телеканалы на своих телевизорах. Веб-камеры в IPTV сортированы тематически и дополняют стандартный набор телеканалов, предлагаемых нами клиентам.
Другая наша фишка – это функционал встраиваемого плеера, как в YouTube или Vimeo. Со своего сервиса мы отдаем видео на некоторые очень известные сайты – это и Краснополянские курорты, и отели. При этом, они не поднимают стриминг на своей стороне, им достаточно просто кода вставки. Встраиваемый плеер может быть как брендирован, так и не иметь каких-либо опознавательных знаков, что позволяет нашим партнёрам самостоятельно оформлять свои страницы в нужном стиле. Примеры:
Три polyanaski.ru/webcam/new/#up
Ещё одна наша фишка – мобильные веб-камеры на базе сотовых телефонов. Мы их назвали «Пушок», от метода передачи видеопотоков push. Это кастомное Андроид-приложение, распространяемое в виде APK-файла. В Маркете его нет и не будет. Идея проста: в мобильном телефоне есть всё, что нужно для видеотрансляции: камера, GPS-позиционирование, канал передачи данных. Мы сделали приложение, которое обрабатывает видео и передаёт его сразу на Сочи.Камеру. Опционально передаются звук и координаты. Предусмотрено создание «чёрных дыр», оказавшись в которых «Пушок» приостанавливает трансляцию. Аналоги «Пушка» хорошо известны, например это «Перископ» для «Инстаграма». Одно время мы думали распространять это приложение среди блогеров, но отказались от этой идеи по ряду причин. Сейчас «Пушки» работают в нескольких городских автобусах, а ближе к сезону возобновят свою работу трансляции с экскурсионных кораблей.
Сама же Сочи.Камера сделана полностью на Яваскрипте. Сервер – на Node.js, браузерная часть – Angular.js
Мобильные приложения для Android, iOS и Windows Phone написаны с использованием стандартных инструментов разработчика. Также стоит добавить, что существует приложение для Windows Desktop, некоторые клиенты предпочитают его браузеру, поскольку работает быстрее, нет рекламы и в целом там минималистичный функционал без «обвеса» в виде чатов и прочего.
Интересно, что за прошедшее время готовых комплексных решений «под ключ» так и не появилось. Существующие готовые видеосистемы предназначены для совсем других целей, в основном для охранного видеонаблюдения. Там есть видеостена, запись, просмотр, перемотка и так далее, но они заточены для охранного видеонаблюдения, а не для работы нескольких тысяч людей одновременно. Это вообще другой подход, другая архитектура.
На этом хотелось бы закончить обзорную статью. Как мы уже говорили выше, можно описать более детально многие элементы системы, они того стоят. Например, о хитростях установки видеокамер на улице в условиях высокой влажности и большого перепада температур, способ организации мобильных камер на автобусах и теплоходе или более подробно о приложениях для смартфонов и их серверной части, или о выборе софта для видео стриминга на сайте. Также можем рассказать кое-что о расходах на разработку и содержание такого проекта. Начальные вливания на разработку за первые несколько лет, например, составили порядка 4 000 000 рублей. Но это не окончательная цифра.
Можете сами задать вопросы, какая часть проекта вам интересна. Ждём ваших вопросов.
Источник