Веб-разработка

индекс
236,88

Web-телефония. Обзор решений

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

Будут рассмотрены следующие задачи:
  1. Голосовая связь один на один между пользователями сайта.
  2. Голосовая конференция, то есть разговор более чем 2 собеседников.
  3. Звонки на стационарные и мобильные телефоны из браузера.
Повторюсь и скажу, что все задачи решаются в рамках web-среды. Основное условие: пользователям не требуется установка дополнительного ПО, только браузер и Flash Player.

Введение


Для начала стоит понять, какие технологии имеются в нашем распоряжении. Если быть реалистами, то по сути единственным вариантом является использование Flash. Да, есть другие технологии, но, к сожалению, все они значительно менее распространены. В то время как Flash установлен почти у всех.

Чем хорош Flash, так это удобной работой с потоковым аудио-видео. Есть два главных метода работы с аудиопотоком во Flash-приложениях:
  • Использование медиа-сервера (media streaming server). В данном случае весь голосовой трафик проходит через сервер. В качестве сервера может выступать Flash Media Server или Red5 (open source).
    Преимущества: хорошая проходимость трафика (firewall и NAT не помеха).
    Недостатки: нагрузка на сервер, большее время отклика, возможность использовать только протокол TCP.

  • Новый P2P-протокол RTMFP, реализованный в Flash Player 10.
    Преимущества: построен на базе протокола UDP, хорошее качество связи, нет нагрузки на сервер.
    Недостатки: плохая проходимость через firewall и NAT (около 60% пользователей), требуется Flash Player 10 версии.
Оптимальное решение на сегодняшний день: динамически определять возможность использования P2P-протокола; использовать его, если есть возможность, иначе — использовать первый вариант.
Есть также надежда, что в ближайшее время Flash-серверы позволят использовать протокол UDP для связи с клиентскими приложениями. В этом случае исчезнут многие недостатки первого решения. Напомню, что протокол TCP гарантирует доставку данных, а UDP — нет. Для передачи голосового трафика в реальном времени не требуется точность данных, требуется гарантированное время доставки и устойчивость к периодическим сбоям канала передачи. Вот почему протокол UDP в данном случае предпочтителен.

Перейдем к более конкретным вещам.

Голосовая связь один на один


С точки зрения разработчика, два варианта реализации передачи аудио (с ретрансляцией через сервер и без) не сильно отличаются. В обоих случаях требуется внешний сервер. Однако, в случае с P2P сервер выполняет лишь вспомогательную роль при установлении соединения. Весь голосовой трафик идет напрямую от клиента к клиенту. Сервер для установления P2P-соединения называется Stratus. В скором времени его функциональность будет встроена в Flash Media Server (и, видимо, Red5). Сейчас единственный вариант — воспользоваться общедоступным beta-сервисом от Adobe.

Отличная статья по использованию нового P2P-протокола — здесь.
Пример реализации — тут.

При использовании ретранслирующего сервера задача является стандартной для Flash-среды. Что в этом случае, что в случае P2P основная идея заключается в том, что каждый из собеседников публикует выходящий аудиопоток и подписывается на входящий. Данные передаются с использованием протокола RTMP (RTMFP, в случае P2P).

Одна из ключевых проблем при реализации голосовой связи один на один — сигнализация пользователей о поступающих звонках. Если пользователь является инициатором звонка, он знает, в какой момент ему инициировать передачу и прием голосового трафика. Что касается пользователя, которому звонят, требуется какой-то способ известить его об этом. Как решать эту задачу — вопрос конкретного приложения.
  • Вариант 1. Использовать асинхронные запросы, выполняемые периодически. Например, 1 раз в секунду. В ответе на запрос должен содержаться признак, что имеется входящий звонок и надо принять решение, отвечать ли на него. Затем, настроить входящий и выходящий аудиопотоки.
  • Вариант 2. Comet-архитектура, когда клиент держит постоянное подключение к серверу и получает ответ только тогда, когда произошло некоторое событие. В данном случае, входящий звонок.
Оба варианта подразумевают использование основных средств web-разработки на стороне сервера (например, php). Хотя, в принципе, для этой задачи можно приспособить и медиа-сервер. На стороне клиента может использоваться Javascript или Flash.
В случае с голосовой связью один на один достаточно просто реализовать схему, которая выше называлась оптимальной. То есть использовать P2P, когда это возможно, иначе — медиа-сервер.

Организация конференций


При организации конференций практически ничего не меняется. Только теперь на аудиопоток любого пользователя подписываются сразу все участники конференции.
Опять же, возможна реализация как через сервер, так и используя P2P. Но в данном случае вероятность, что P2P не будет функционировать, выше по простой причине, что участников обмена здесь уже не два, а больше: у кого-нибудь да не заработает.

Звонки на стационарные и мобильные телефоны


Пожалуй, самая интересная тема из рассматриваемых. Для решения задачи используется SIP-шлюз любого оператора IP-телефонии. Схема работы здесь следующая:
  1. Организуется двусторонняя передача аудиоданных между клиентским Flash-приложением и медиа-сервером по протоколу RTMP.
  2. На стороне медиа-сервера происходит транскодирование голосового трафика. То есть перекодирование аудио из одного кодека в другой. Flash поддерживает два кодека для работы с голосом: Nellymoser и SPEEX (начиная с 10 версии).
    Также медиа-сервер должен уметь работать со стеком SIP-протокола.
  3. Таким образом, на стороне медиа-сервера строится мост: Flash Player <-> SIP.
Red5phone — проект с открытым исходным кодом, который реализует описанную схему. Проект достаточно сырой, но является хорошей отправной точкой.

Рабочие примеры


Голосовая связь пользователей один на один с использованием P2P-протокола реализована в приложении для социальной сети ВКонтакте.Онлайн, автором которого являюсь я.
Также была реализована техническая платформа для совершения из приложения звонков на стационарные и мобильные телефоны через SIP-шлюз. Однако, в публичный доступ технология не была запущена.
Пример реализации связки Flash <-> SIP: проект flaphone.

Применения


У описанных технологий есть целый ряд применений. Например, использование в рамках движка CMS-системы или организация службы телефонной поддержки на сайте компании, интернет-магазина.
+27
29 сентября 2009, 16:09
90

комментарии (24)

0
Scorpion #
еще бы sip шлюзы операторов по дешевле достать…
0
locust #
Здесь есть таблица цен — практически в любую сторону можно выбрать нулевой тариф:
backsla.sh/betamax
Алсо, в сентябрьском хакере есть initial-статья по этому поводу.
0
yrygvay #
на офиц сайте есть информация как это детище можно привязать к различным CMS?

Да и вообще где можно почитать про конкретное внедрение?
0
mokaton #
Пока технологи сырая, поэтому подобные решения делают только на коленке и ради развлечения. Сам adobe еще из беты не вывел stratus из беты и пока для его работы используется только их сервер, а ведь не хочется зависеть от них! Вот так и получается, что только все в статьях и «пробах» :)
+2
flasher108 #
Flaphone — совсем не сырой :) Он работает уже очень давно и хорошо, при этом позволяет позвонить еще и на Skype. Для организации службы поддержки есть CallMe-виджет, который можно размещать на своем сайте — он будет звонить куда вы ему скажите на SIP URI, Телефонный номер через SIP-оператора или на пользователя Skype. Используя Gtalk2voip гейтвей, можно звонить еще и на gtalk/yahoo/msn. Как-то так.
0
andoriyu #
что за CallMe?
0
flasher108 #
CallMe — это фича сервиса flaphone, вы можете получить embed-html код, как у плеера youtube, который покажет кнопку, при нажатии на которую произойдет вызов на указанный номер,SIP URI или SkypeID. Подробнее можно почитать в разделе help flaphone. flaphone.com/help.php#callme_widget
А действии можно посмотреть здесь: innosystems.ru/index.php?id=15
0
StopDesign #
Плохо, что без картинок.
+1
flasher108 #
Кстати, вопрос автору (Голосовая связь пользователей один на один с использованием P2P-протокола реализована в приложении для социальной сети ВКонтакте.Онлайн) — что вы будете делать, если Adobe отключит Stratus или у них сервера упадут или еще что-нибудь? Просто видел уже много решений, которые работают на Stratus-серваках и авторы их позиционируют как свой сервис… сервис-то не ваш, ваше только приложение…
0
alexeyb #
Будьте добры, поделитесь ссылками на такие сервисы.

Отвечаю: если что-то произойдет со Stratus, то делать ничего не буду. Голосовая связь не будет работать. Такой риск действительно есть.
Но вряд ли это произойдет. Сервис достаточно прост по своей сути, не требуется больших серверных мощностей. Также очень вероятно, что в рамках Red5 появится реализация RTMFP.
0
flasher108 #
Сервис прост, пока его используете только вы, а как только на него сядет побольше сервисов неизвестно, как он себя поведет. К тому же есть проблема — если у ваших пользователей у обоих симметричный НАТ или еще кое какие ограничения, то p2p медиа сессия не установится и они будут слушать тишину, а вы при этом никак не узнаете об этом, так как сервер не ваш, а адобовский. По поводу RTMFP в Ред5 — я думаю, что пройдет еще достаточно много времени пока оно там появится в нормальной реализации, от года до двух.
0
mokaton #
Тут вы не правы. Stratus не может установить соединение до тех пор, пока нет ответа от ТОЙ стороны. Т.е., конечно, соединение с сервером он установит, но вот с клиентом нет и сообщит об этом. Я сам проверял ;)
0
flasher108 #
Если вы используете их HTTP-сигналиацию, то да, оно спросит у сервера и скажет, а если вы хотите использовать свою сигналиацию — то как-раз нет.
0
mokaton #
И мне тоже, ссылочек отсыпьте, пожалуйста! :)
0
flasher108 #
Да, например, сервис TokBox (из того, что пришло в голову сразу)
+1
Scissors #
спасибо за статью, сейчас это актуально
0
nekt #
Было бы интересно почитать о связках SIP<->городские телефоны. В том числе и о решениях которые можно использовать у себя дома.
0
checkpoint #
Раз такая пляска, позволю себе немного порекламировать нашу разработку: www.flash2voip.com — простой flash-based SIP телефон (с книгой контактов на сервере). Работает с SIPNET, Gizmo5 и прочими бетамаксами. Регистрации не требует, однако обязательно наличие рабочего SIP аккаунта.

В основе лежит наш GTalk2VoIP Gateway к которому мы уже год назад имплементировали модуль поддержки протокола RTMP и возможность шлюзовать в SIP и H.323, но вот приложение сделали совсем недавно.
0
Impressario #
Скажите а реально я могу сейчас на сайте интернет магазина такое использовать. Не очень в технологиях понимаю, но с точки зрения маркетинга это штука отличная…
0
flasher108 #
см. CallMe-виждет от flaphone или TringMe-виджет от TringMe )
0
Deepwalker #
Вообще обзор решений сейчас будет в комментариях. А в статье был обзор технологий.
0
rPman #
Меня больше в данном случае интересует именно реализация p2p+web технологии в общем случае (для игр например), какие на данный момент имеются решения, только ли при использовании flash/java/activex (чур меня)?
что про это говорит спецификация html5?
0
Deepwalker #
dev.w3.org/html5/websockets/
Но тут явно вам p2p не видать. Вообще любые такие возможности в браузере потенциально опасны. Вас даже не надо заражать, чтобы включить в ботнет — просто влезть на стартовую страничку.
0
rPman #
я не говрю о полноценных http протоколах, но возможность соединения на своих протоколах (пусть даже определяемых платформой) между клиентами дадут офигительные возможности

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.