Всем привет.
Боремся с пробками вместе
В рамках этого проекта в г. Красногорск, мы решили установить пару сетевых камер и сделать удобным просмотр потокового видео. Забегая вперед, результат можно посмотреть на
нашем сайте или с мобильного телефона по wap
www.ventumnet.ru/camera
Был какой-то опыт с камерами
Axis, которые, безусловно, являются флагманами индустрии, но мы остановились на более бюджетном варианте — сетевыми камерами
DCS-2102 от D-Link.
Стоят они в районе 4000 рублей. За эти деньги Вы получаете сносную картинку и битрейт, а самое главное — доступ по протоколу
RTSP, причем сразу с настроенным профилем для просмотра на мобильных телефонах имеющих на борту плеер 3gp, в нашем случае это был
T650i от Sony Ericsson.
Реализация
Для удобства просмотра в вебе решили конвертировать видео в онлайне в flv с помощью vlc, запущенного в режиме vlm.
Делается это так:
cvlc -I telnet --telnet-password your_password --rtsp-caching=1200 --video --no-sout-audio --udp-caching=30000 --http-caching=5000
Все параметры кеширования подобраны опытным путем, в вашем случае они могут быть другими.
В принципе, с камер также идет звук, но нам он не нужен, поэтому --no-sout-audio.
- Подготавливаем конфиг /home/vlc/playlist.txt:
new kamera4 broadcast enabled
setup kamera4 input "rtsp://ip_address:554/mp4"
setup kamera4 output #transcode{vcodec=FLV1,vb=2048,acodec=mp3,samplerate=22050}
:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8084/stream4.flv}
new kamera3 broadcast enabled
setup kamera3 input "rtsp://ip_adress2:554/mp4"
setup kamera3 output #transcode{vcodec=FLV1,vb=2048,acodec=mp3,samplerate=22050}
:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8083/stream3.flv}
control kamera4 play
control kamera3 play
Обратите внимание на dst, порты встроенного в vlc вебсервера — разные, на одинаковых запустить не удалось, хоть это и странно, и наверняка в следующих релизах vlc станет возможным отличать потоки только по второй части url, типа /stream1.flv /stream2.flv ..etc.
Камеры настроены соответствующим образом, отдают 2 мегабита.
# telnet localhost 4212
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Password:
Welcome, Master
> load /home/vlc/playlist.txt
> exit
Connection closed by foreign host.
- Проверяем, слушает?
# netstat -an | grep 808
tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8082 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8083 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8084 0.0.0.0:* LISTEN
- Можно wget'нуть.
# wget "http://localhost:8084/stream4.flv"
--2009-01-26 11:03:14-- localhost:8084/stream4.flv
Распознаётся localhost... 127.0.0.1
Устанавливается соединение с localhost|127.0.0.1|:8084... соединение установлено.
Запрос HTTP послан, ожидается ответ... 200 OK
Длина: нет информации [video/x-flv]
Сохраняется в каталог: `stream4.flv'.
[ <=> ] 1 114 847 85,8K/s ^C
- В качестве плеера использовали JW FLV Player
Для получения статических картинок, а не потокового видео, пришлось подписывать NDA с D-Link'ом, чтобы получить доступ к камерам по http. Из соображений NDA ссылку мы приводить не будем, она просто вида kamera/cgi-bin/dai_mne_kartinuku_plz.cgi
- Попутно делаем wap-сайт, на котором можно либо смотреть картинки, либо прямо перейти по ссылке rtsp:// сразу на камеру. Заодно берем с gismeteo.ru погоду в /tmp/temp и оверлеем ее с помощью
convert $IMAGE_PATH/cam2_new.jpg -fill yellow -pointsize 22 -gravity "South" -dr
aw "text -230,310 'Сейчас `cat /tmp/temp`°C'" $IMAGE_PATH/cam2_new.jpg
Картинка 160х120, битрейт 256 килобит/c, 5 fps, вполне себе смотрится через GPRS.
- Размещаем камеры на google maps.
- Посмотреть вживую можно на http://www.ventumnet.ru/live и через wap на www.ventumnet.ru/camera
Недостатки:
На данный момент существует какая-то проблема в сочетании adobe flash player 10, jw flv player'а 4.1.6 и конкретно нашего потокового видео. В adobe flash player 9 проблем не наблюдается.Проблема побеждена, решилась дополнительным инициализационным параметром start для jw flv player'а, который отвечает за то, с какого фрейма начинать воспроизводить видео. Очень помог пост отсюда, большое спасибо автору!
- Камеры виснут раз в месяц, иногда чаще. Они доступны через http но перестают отдавать rtsp. С обновленной недавно прошивкой они стали работать лучше, но проблема сохранилась. Все камеры ломаются одновременно, т.е. тут роль играет время. В новой прошивке, кстати, добавилась поддержка ночного режима, теперь даже при свете фар что-то видно.
- VLC тоже может упасть если долгое время поток недоступен.
- Все мобильные телефоны напрямую обращаются к камерам, что, безусловно, создает на них нагрузку. Производителем обещано до 10 одновременных мобильных клиентов, на практике, нужно, конечно, со временем и ростом нагрузки, переложить функцию доставки мобильного видео также на vlc.
- Погоду хочется брать не из открытых источников, а с сетевых датчиков влажности/температуры, подскажите, есть такие в продаже?
- Необходимо решить задачу записи видео, пробовали zoneminder, не понравилось, еще варианты?
Статья публиковалась в песочнице, реакции не последовало, поэтому по просьбе автора решил разместить от своего имени. Соответственно, на комментарии будет отвечать (по мере возможности) сам автор от моего имени.
_________
Текст подготовлен в
ХабраРедакторе
комментарии (72)
А каким способом Вы подключили камеры к серверу в дата центре?
или вы подключили к машине в локальной сети (которая рядом с камерой) с прямым ipом а с продакшена тянете потом с машины из локальной сети?
Спасибо
Стриминг-сервер находится в «дата-центре», у него тоже реальный адрес, он берет потоки по rtsp и выдает их на себе на 0.0.0.0:8081, например, далее отдельная машина с паблик веб-сервером, на котором jw плееру просто скармливаются ссылки со второго сервера. В общем, все это не принципиально, но спасибо за вопрос.
Ошибка разбора XML: синтаксическая ошибка (Строка: 2, Символ: 0)
Ошибка:XML declaration not at beginning of document
Описание:http://www.w3.org/TR/REC-xml/
1:
2: <?xml version='1.0'?>
…
www.validome.org/lang/en/errors/XML-DECLARATION/1005
:-)
только она под linux, но то что вы описали и там заработает
вроде умеет сразу в flv писать
хочется чего-то большего, не использовать статические картинки вообще, писать, допустим, маленькими блоками, но видео, при этом на уровне плеера делать что-то вроде индексированного плейлиста по минутам, надеюсь, идея понятна.
если все пройдет удачно, выложу статью про то, как мы записываем мультикастный поток iptv и интегрируем с программой передач, так, что можно посмотреть конкретную передачу по конкретному каналу за последние несколько дней. а тут, по сути, практически то же самое, но дискретность повыше.
всем спасибо за ответы, пойду спать. до завтра, если доживет :)
ну а iptv это совсем про другое
20-50кбит еще можно поверить.
map.openInfoWindow), в котором запускается JW FLV Player через его javascript API. Стандартная иконка маркера в виде красной капли заменена на иконку вебкамеры, ориентированную в ту часть света, куда в реальности смотрит камера :)У нас в офисе работает дурацкий videonet (уже в печенках сидит, оно конечно мощное но неповоротливое)
Жаль нельзя использовать уже эти карты…
Остальное поспрашиваю с утра, щас спать повалился…
некоторые камеры шатает ветром, и поэтому изображение размывается…
как-то выжили. иногда, бывает, конкретно запотевают, но потом, в солнечную погоду, все возвращается.
Может кстати есть какая коробка которая их сможет сделать как сетевыми?
Но стоит около 1600 Ойро.
Oregon Scientific WMR928. Пример использования с выводом «наружу» можно посмотреть здесь.
К указанным выше компаниям не имею отношения, просто самому было интересно, искал решение, нашел.
Дома не у всех есть выделенный ip, ну или как вариант лень его оплачивать.
Да есть всякие dyndns, но как то криво и не красиво.
Но есть еще ряд людей, у которых есть сервера мощные в дата центрах :)
Можно каким то образом, направить поток на такой сервер? и с него уже выводить на корпоративном сайте камеру :D?
Даже имея серый адрес вам никто не мешает перманентно настроить трансляцию по udp на любой внешний хост. Т.е. данные будут сами слаться. Там можно забирать и дальше вперед.
а можно как то поподробнее? если не сложно.
те один VLC должен передовать другому?
типа vlc поток_с_камеры --sout udp:real_ip --ttl 20 (текущее количество хопов до внешнего хоста), под windows это все делается через gui, не суть
а на сервере забирать типа vlc udp://real_ip:port ну и дальше что нужно с ним делать, можно, как у нас, транскодить и дальше что-то делать.
тут именно смысл в том, что трафик инициируется вашей домашней машиной, т.е. вы шлете сами, без запросов от сервера.
полоса соответственно будет постоянно заюзана.
и сколько уходит на upload?
нагрузку оценить сложно, опыт показал, что если не измываться над исходным потоком — не менять особо битрейт, не ресайзить картинку и т.п., то нагрузка существенно меньше. кодек попроще, инкапсуляцию…
про upload не понял, есть битрейт=полоса, умножаем на время, получаем трафик…
может знаете, что то получше? Хочется все же полностью автономную систему. (videonet задрал)
Можно тогда через веб доступ мониторить ПС и помогать юзерам =) и полностью отказатся от vnc.
Попробовал у себя на маке, понравилось =)
можно их камеры пока смотреть в первоисточнике, на ipls.ru
Не подскажете, что может быть не так? Исползую FLV1, и есть подозрение, что какие-то проблемы с кодеком, именно в ОС (FreeBSD 7.1-RELEASE). Стоит ffmpeg-2008.07.27_10 из портов, vlc-0.9.9.a_1,3 — оба из портов. Битрейт пробовал разный — не влияет.
Еще момент: я пробовал wget'ать
wget localhost:8081/cam.flv
Resolving localhost… 127.0.0.1
Connecting to localhost|127.0.0.1|:8081… connected.
HTTP request sent, awaiting response… 200 OK
Length: unspecified [video/x-flv]
— почему-то очень низкая скорость, 3.28K/s, 2.76K/s и т.д. Может тут проблема?
Конфиг:
setup kamera output #transcode{vcodec=FLV1,vb=2048,acodec=mp3,samplerate=22050}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/cam.flv,delay=1000}
Сделал все как написано в статье, не ругается, но wget ничего не скачивает, т.е. в flv ничего не жмется :(