четверг, 2 августа 2012 г.

Организация потокового вещания с ip камеры.

Была необходимость организовать вещание с камеры для видеонаблюдения на сайте организации. Причём надо было рассчитывать на то что количество камер будет со временем увеличиваться.

Анализ проблемы показал, что вся система должна состоять из нескольких компонентов: источник видеопотока (в моём случае камера), стрим сервер, вебсервер со страничкой куда будет встроен flash player.

Дальнейшее изучение камер дало следующее: все flash плееры (я рассматривал только бесплатные) принимают поток в формате RTMP - это стандарт для флеша. Но ни одна из рассмотренных мною камер не могла создавать поток в этом формате. Зато почти все более менее современные камеры умеют создавать RTSP потоки. Это означает что стрим сервер должен уметь конвертировать один поток (откамеры) в другой (для клиента).

Так же камеры различаются поддерживаемыми форматами видео. Современный стандарт вещания в интернет это h264, это значит что если камера не умеет кодировать видео этим кодаком, это придётся делать серверу или понадобится посредник выполняющий эту работу. То же касается аудио, стандартом вещания является AAC ну или на крайняк mp3. 

Исходя из описанного выше приходится выбирать. Или купить дешёвые камеры но зато разориться на дорогостоящем софте для переконвертирования потоков. Или купить дорогие камеры способные изначально создавать контент пригодный для передачи пользователям.

Конечно рассматривался вариант с покупкой дешёвых камер и использования свободного софтак (такго как vlc live555 Red5) для организации трансляции. Но опыты показали, что экономия на камерах обернётся тратами на покупку мощных серверов, т.к. такой вариант требует больших вычислительных мощностей.

В итоге была куплена камера с аппаратной поддержкой h264/AAC. Это позволило сильно снизить нагрузку на сервер. Единственное что теперь необходимо сделать это преобразовать RTSP от камеры в RTMP для флеш плеера клиента.

Для этой задачи был выбрал молодой проект Erlyvideo. Он распространяется в двух версиях. Минимальный функционал доступен под свободной лицензией (GPL). В моём случае минимального функционала было вполне достаточно. На сайте есть довольно полная документация по установке. Сразу скажу, что авторы программы официально поддерживают только Debian\Ubuntu, однако я без труда собрал его для CentOS 6.2.

Последнее что осталось сделать это поместить на вебстраничку flash плеер. Их много разных, мне хватило бесплатного JWPlayer. Инструкция по его настройке так же доступна в документации по Erlyvideo.

У этой реализации есть лишь один недостаток, обладатели iPhone и iPad не смогут просматривать вашу трансляцию т.к. не поддерживают flash. Для вещания в фомате Apple можно купить лицензию, это то же описано в документации.

Ну и на последок приведу пример встраивания флеш плеера в страничку
<html>
<head>
<title>Онлайн вещание</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8;">
<script type='text/javascript' src='jwplayer.js'></script>
</head>
<body>
<div id="player"></div>
<script type="text/javascript">
jwplayer("player4").setup({
'flashplayer': 'player.swf',
'height': '512',
'width': '960',
'file': 'pl.xml',
'playlist.position': 'right',
'playlist.size': '320',
'autostart': 'true'
});
</script>
</body>
</html>
Предполагается что архив с плеером распакован в директорию где находится страничка. В pl.xml находится плей лист с указанием адреса потокового сервера и потоков, вот его содержание

<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/"
  xmlns:jwplayer="http://developer.longtailvideo.com/">
  <channel>
    <title>Playlist with RTMP Dynamic Streaming</title>
    <item>
      <title>Камера</title>
      <description>Камера на входе.</description>
      <media:group>
        <media:content bitrate="1800" url="camera"  width="1280" />
      </media:group>
      <jwplayer:streamer>rtmp://<ip_adres>:1935/</jwplayer:streamer>
    </item>
  </channel>
</rss>





Extreme x460-48 SammitStack-V

Закупили несколько коммутаторов ExtreameNetworks серии x460. Было желание объединить их в стек при помощи оптических линий связи. Информации по настройке на русском языке просто нет, пришлось изучать мануал.

Каждый коммутатор поддерживает стековое соединение только с двумя другими коммутаторами (хотя стековых портов можно установить больше чем два). По умолчанию коммутатор старается использовать для соединения в стек фирменные интерфейсы (устанавливаются как модуль расширения), по этому команда для создания стека этот самый стек не создаёт.

Перед созданием стека нужно переназначить стековые порты на оптические SFP+, делается это так
configure stacking-support stack-port [1|2|all] selection alternate
Из синтаксиса команды видно что можно переназначить как все сразу так и каждый порт по отдельности.

После того как все стековые порты назначены даём команду на создание стека
configure stacking easy-setup
Так же нужно помнить про ограничения. В одном стеке может быть не больше 8 коммутаторов. А соединение в стек по технологии  SammitStac-V (по оптике) может производиться только напрямую (то есть без посредников виде других коммутаторов и маршрутизаторов).

вторник, 24 июля 2012 г.

SIP телефония

Решил поискать замену почившему Skype и наткнулся на такую вещь как SIP телефония.

Попытка использовать бесплатных провайдеров вроде Ekiga к успеху не привела и тогда было решено посмотреть что предлагают за деньги.

Первое что попалось http://zadarma.com?ref=c4674753433996a11b74bd0c7293f2ea . Мне повезло и первый же эксперимент с платными услугами оказался удачным. Теперь надо привыкнуть к использованию программного телефона для звонков за пределы области.

Скажем звонки на мобильники по России, где то 6 центов, и это выгодно если абонент находится в другой области.

Кроме провайдера конечно необходим ещё и телефон. Я в качестве телефона решил использовать свой нетбук с Fedora 17 на борту и программным телефоном SFLphone. К сожалению RPM пакетов пока нет, по этому собираю из исходников по этой инструкции http://blog.randell.ph/2012/04/09/how-to-install-sflphone-on-fedora-16/ . Правда она немного устарела.

Конечно этот провайдер не единственный и в поисковике легко находится ещё с десяток но у меня не было желания пробовать их все. Это же касается и программных телефонов, я попробовал несколько из присутствующих в репозитории моего дистрибутива но не один мне не понравился (либо не работал, либо выглядел страшно, либо не умел работать с новомодным PulseAudio). 

среда, 18 июля 2012 г.

Squid и splash_page

Постановка задачи:

Организовать перенаправление пользователей халявного WiFi на информационную страничку. При этом необходимо показывать информационную страницу только раз за сессию.

Решение:

В сети уже использовался прозрачный прокси Squid и в нём был интересующий меня функционал. Версия сквида 3.1.10, самая свежая из стабильных. Настройка производилась по этому мануалу http://wiki.squid-cache.org/ConfigExamples/Portal/Splash.

При проверке примера столкнулся с проблемой: сайт указанный в директиве deny_info, не открывался как я этого ожидал, а постоянно редиректился сам на себя. Природу этой проблемы я так и не выяснил, но возможно позже разберусь и дополню. 

В противоположность внешним сайтам, страницы ,сохранённые  на прокси локально открывались как и обещано в мануале. Из этого родился костыль, в локальную страницу помещался однострочник на яваскрипт, перенаправляющий пользователей на необходимый ресурс.
setTimeout(location.replace("http://exempl.ru"),1000);
как вариант  можно ещё так, этот вариант лучше воспринимается iУстройствами
<meta http-equiv="refresh" content="1;URL='http://exampl.ru/'"> 
Можно заметить что указан таймаут в 1 секунду. Это то же от не знания как решить проблему. По идее задержка должна регулироваться в дерективе
external_acl_type splash_page ipv4 ttl=6 concurrency=200 %SRC /usr/lib64/squid/squid_session -t 7200
а именно  ttl=0, но даже при значении 0 пользователь вынужден ждать минимум секунду, всё это время происходит постоянный редирект, то есть страница постоянно обновляется. Выглядит это не красиво и рас уж нельзя отказаться от ожидания, пусть лучше пользователь видит пустую страницу.