войти зарегистрироваться

Web-разработка whois

индекс
184,85

Организация видеотрансляции на сайте

Всем привет.

Боремся с пробками вместе


В рамках этого проекта в г. Красногорск, мы решили установить пару сетевых камер и сделать удобным просмотр потокового видео. Забегая вперед, результат можно посмотреть на нашем сайте или с мобильного телефона по wap www.ventumnet.ru/camera



Был какой-то опыт с камерами Axis, которые, безусловно, являются флагманами индустрии, но мы остановились на более бюджетном варианте — сетевыми камерами DCS-2102 от D-Link.
Стоят они в районе 4000 рублей. За эти деньги Вы получаете сносную картинку и битрейт, а самое главное — доступ по протоколу RTSP, причем сразу с настроенным профилем для просмотра на мобильных телефонах имеющих на борту плеер 3gp, в нашем случае это был T650i от Sony Ericsson.

Реализация


Для удобства просмотра в вебе решили конвертировать видео в онлайне в flv с помощью vlc, запущенного в режиме vlm.
Делается это так:
  1. cvlc -I telnet --telnet-password your_password --rtsp-caching=1200 --video --no-sout-audio --udp-caching=30000 --http-caching=5000

    Все параметры кеширования подобраны опытным путем, в вашем случае они могут быть другими.
    В принципе, с камер также идет звук, но нам он не нужен, поэтому --no-sout-audio.
  2. Подготавливаем конфиг /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 мегабита.

  3. # 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.

  4. Проверяем, слушает?

    # 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


  5. Можно 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

  6. В качестве плеера использовали JW FLV Player
    Для получения статических картинок, а не потокового видео, пришлось подписывать NDA с D-Link'ом, чтобы получить доступ к камерам по http. Из соображений NDA ссылку мы приводить не будем, она просто вида kamera/cgi-bin/dai_mne_kartinuku_plz.cgi
  7. Попутно делаем 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.
  8. Размещаем камеры на google maps.
  9. Посмотреть вживую можно на 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)

  • «переложить функцию доставки мобильного видео на vlc» это жестоко. Для этого есть стриминг-серверы. Например опенсорсный эппловский Darwin Streaming Server.
    • спасибо, будем пробовать.
    • Кстати а почему жестоко  ? вроде как vlc себя так и позиционирует, как не только медиа проигрыватель.
      • Потому что делать стриминг для него — не проблема, но, есил я верно помню, на большом количестве клиентов его производительность может резко падать. А DSS, будучи предназначенным исключительно для этого, показывает вполне неплохие результаты.
  • Включить ретранслятор и все виды потоков для клиентов через него отдавать и будет отлично
  • Спасибо Вам за статью.

    А каким способом Вы подключили камеры к серверу в дата центре?
    или вы подключили к машине в локальной сети (которая рядом с камерой) с прямым ipом а с продакшена тянете потом с машины из локальной сети?

    Спасибо
    • Наша локальная сеть — полностью маршрутизируемая, мы можем подать на любой управляемый порт нужный vlan. Таким образом, у всех камер реальные ip-адреса.
      Стриминг-сервер находится в «дата-центре», у него тоже реальный адрес, он берет потоки по rtsp и выдает их на себе на 0.0.0.0:8081, например, далее отдельная машина с паблик веб-сервером, на котором jw плееру просто скармливаются ссылки со второго сервера. В общем, все это не принципиально, но спасибо за вопрос.
      • физически к инету та как подключили? а то в статье так и не раскрыто…
      • Удачи Вам в развитии проекта:)
  • Напишите в личку — поделюсь инвайтом для автора статьи.
    • Спасибо :) Сбылась мечта.
  • Поправьте wap версию.

    Ошибка разбора 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
    • Поправили, спасибо.
      • На самом деле, не совсем. Осталось закрыть <img /> :)
        • ага, thx!
  • Пока подобного сервиса ни у одного «гиганта» по предоставлению информации о пробках типа смилинка или яндекса не видел. Проект можно сделать и вкусно продать. Источником видео информации могут являться камеры проекта Безопасный Город Москва.
    • Автор принимал участие в этом проекте в Тимирязевском районе г. Москвы с 900 аналоговыми камерами. В качестве софта использовали itv.ru
  • Так, кто это у нас ездит каждый день ровно в 13:00 на черном мерсе с затонированными стеклами…
    :-)
  • ура! спасибо! сейчас эйфория пройдет и смогу сам отвечать на все вопросы.
  • очень боюсь «хабраэффекта» :)
  • для записи видео есть такая штука www.lavrsen.dk/twiki/bin/view/Motion/WebHome
    только она под linux, но то что вы описали и там заработает
    вроде умеет сразу в flv писать
    • да, видел, еще очень давно, старый проект — motion.
      хочется чего-то большего, не использовать статические картинки вообще, писать, допустим, маленькими блоками, но видео, при этом на уровне плеера делать что-то вроде индексированного плейлиста по минутам, надеюсь, идея понятна.

      если все пройдет удачно, выложу статью про то, как мы записываем мультикастный поток iptv и интегрируем с программой передач, так, что можно посмотреть конкретную передачу по конкретному каналу за последние несколько дней. а тут, по сути, практически то же самое, но дискретность повыше.

      всем спасибо за ответы, пойду спать. до завтра, если доживет :)

      • что касается картинок, то motion и без картинок работает — может тянуть MJPEG поток с камеры.
        ну а iptv это совсем про другое
  • 160х120, битрейт 256 килобит/c, 5 fps — что-то сильно жирно для такого битрейта.
    20-50кбит еще можно поверить.
    • Тфу, сильно жирно для такого разрешения и fps
  • круто… надо будет попробовать реализовать
  • Посоветуйте кто-нить что-то кроме пафосных axis, подешевле. Для счастья надо отправки по фтп, cron.
  • Xumepa, спасибо, офигенский сервис! Есть ли в планах камеры на Речной улице повесить, там тоже вечно стоит :(?
    • Поставим со временем везде, где стоит. Спасибо за интерес.
  • Расскажите, плз, как вы разместили камеру на Google Maps?
    • да, собственно, стандартными info bubble, конкретно эту часть делал другой человек из команды, появится, попрошу, чтобы отписался поконкретнее.
    • При клике по ссылке в меню или маркеру на карте открывается InfoWindow (map.openInfoWindow), в котором запускается JW FLV Player через его javascript API. Стандартная иконка маркера в виде красной капли заменена на иконку вебкамеры, ориентированную в ту часть света, куда в реальности смотрит камера :)
      • Блин, я думал как-то попроще там ;) Спасибо
  • Блин, я давно думал как бы такое сделать =)
    У нас в офисе работает дурацкий videonet (уже в печенках сидит, оно конечно мощное но неповоротливое)

    Жаль нельзя использовать уже эти карты…

    Остальное поспрашиваю с утра, щас спать повалился…
  • Спасибо за камеры! Теперь можно будет прикинуть сколько на дорогу отводить)) И за статью спасибо, весьма интересно!
    • А мне реально с гуглом понравилось, боюсь теперь всю ночь не усну пока не сделаю так же =)
  • Почему-то камера Ленина, 5 — NW всегда тормозит, а остальные работают как часы!
    • камеры всю зиму стояли без кожухов, залитые герметиком, без корпуса даже. немного запотели, может, поэтому.
      некоторые камеры шатает ветром, и поэтому изображение размывается…
      • Странно как они без кожухов выжили…
        • ну, решение изначально «бюджетное», поэтому вместо кожухов использовались пластиковые бутылки литровые, сами камеры разобраны до плат и залиты герметиком. :)
          как-то выжили. иногда, бывает, конкретно запотевают, но потом, в солнечную погоду, все возвращается.
          • А что от можно посоветовать для уличного и не бюджетного решения?
            • а какая нужна камера? ip или аналоговая?
              • ip. Хотя у нас есть аналоговые, но они подключены уже к videonet.
                Может кстати есть какая коробка которая их сможет сделать как сетевыми?
                • Просто думаю развести коаксиальный кабель терминалом, и пустить на два устройства.
                • smartec-cctv.ru
            • mobotix.com IP камеры на Linux, матрица 3МП, умеют управлять светом/дверьми, звонить на телефон и много еще чего.
              Но стоит около 1600 Ойро.
  • Респект за реализацию. Темболее что скоро переезжать в Красногорск ))
  • Относительно погоды, рекомендую посмотреть в сторону погодных станций с датчиками, допустим
    Oregon Scientific WMR928. Пример использования с выводом «наружу» можно посмотреть здесь.

    К указанным выше компаниям не имею отношения, просто самому было интересно, искал решение, нашел.
    • Супер, возможно, то что нужно. Спасибо!
    • а оно под какую ОС? Если под Win, если ли под linux?
  • В принципе, кстати, с камер также идет звук, даже на мобильном телефоне слышно, если смотреть, надо попробовать его до flv догнать. Правда, кроме шума ветра, особо ничего там и не будет, но если камеру поставить в место поинтересней…
  • Очень странно, конечно: в «песочнице» статья висела две недели, эффекта 0. При этом, насколько я вижу, сообществом тема воспринялась вполне дружелюбно. Это значит, что песочница себя не оправдывает, и наверняка кто-то сильно по этому поводу расстраивается. Нечестно.
    • Тема очень интересная. Я бы например одну бы камеру поставил дома, и тут возникает один вопрос.
      Дома не у всех есть выделенный ip, ну или как вариант лень его оплачивать.
      Да есть всякие dyndns, но как то криво и не красиво.
      Но есть еще ряд людей, у которых есть сервера мощные в дата центрах :)
      Можно каким то образом, направить поток на такой сервер? и с него уже выводить на корпоративном сайте камеру :D?
      • если вы живете в Красногорске, подключайтесь :)
        Даже имея серый адрес вам никто не мешает перманентно настроить трансляцию по udp на любой внешний хост. Т.е. данные будут сами слаться. Там можно забирать и дальше вперед.

        • Нет в Москве =)
          а можно как то поподробнее? если не сложно.
          те один VLC должен передовать другому?
          • ну, грубо говоря, можно сделать так на вашей домашней машине так
            типа vlc поток_с_камеры --sout udp:real_ip --ttl 20 (текущее количество хопов до внешнего хоста), под windows это все делается через gui, не суть

            а на сервере забирать типа vlc udp://real_ip:port ну и дальше что нужно с ним делать, можно, как у нас, транскодить и дальше что-то делать.

            тут именно смысл в том, что трафик инициируется вашей домашней машиной, т.е. вы шлете сами, без запросов от сервера.
            полоса соответственно будет постоянно заюзана.

            • Как я писал выше, у нас есть камеры, думаю посмотреть устройство которое сможет их превратить в ip. (может вы такие знаете? ) и примерно какая нагрузка на преобразовании mpeg в flv?
              и сколько уходит на upload?
              • видеосервера axis не в счет?
                нагрузку оценить сложно, опыт показал, что если не измываться над исходным потоком — не менять особо битрейт, не ресайзить картинку и т.п., то нагрузка существенно меньше. кодек попроще, инкапсуляцию…
                про upload не понял, есть битрейт=полоса, умножаем на время, получаем трафик…
                • у axis регистратор как то не ахти. 1 кадр в секунду сказали маловато =)
                  может знаете, что то получше? Хочется все же полностью автономную систему. (videonet задрал)
            • Кстати, тут пришла мысль сделать потоковую картинку с десктопа во flash =)
              Можно тогда через веб доступ мониторить ПС и помогать юзерам =) и полностью отказатся от vnc.
              Попробовал у себя на маке, понравилось =)
  • если кому интересно, благодаря хабре мы получили 40мегабит исходящего трафика. ~20 одновременных пользователей по 2 мегабита, получается. неплохо. всё выжило :)
  • А почему меня при щелчке на любой камере снабжают таким сообщением?
    • странно, у нас работает.
      • А камеры от ipls.ru когда будут работать?
        • да вот неудачно vlc обновили, теперь с транскодингом mms проблемы.
          можно их камеры пока смотреть в первоисточнике, на ipls.ru
          • Камера которая смотрит на Макдональдс наклонилась или её, что-то закрыло (
            • Только сейчас обратил внимание на ссылку «сообщить о проблеме с камерой» :)
  • Получается ужасная картинка: spline.ifmo.ru/cam2/
    Не подскажете, что может быть не так? Исползую 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}
  • а не в курсе с этих камер можно получить одиночный jpeg?
  • Мы запустили услугу распространения потокового (streaming) видео через CDN, можем дать вам попробовать.
  • У меня камера D-Link DCS-2100, видео отдает по IP/cgi-bin/video.vam
    Сделал все как написано в статье, не ругается, но wget ничего не скачивает, т.е. в flv ничего не жмется :(
Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.