Юзаем Adobe Stratus
Последнее время много приходится писать и делать в области трансляции потоков данных, вчастности видео-аудио с камеры и микрофона пользователя. Возможно эта тема действительно набирает обороты и заказчики обращают пристальное внимание на возможности флэш-платформы в этой области, возможно просто, как говорится, "масть пошла". Тем не менее еще один материал о трансяции живого потока с камеры и микрофона пользователя широким массам интернет общественности, только теперь на основе технологии p2p, с примером и открытым кодом. Начиная с 10 версии Adobe Flash Player поддерживает возможность передачи данных непосредственно с одного компа на другой посредством протокола UDP без помощи медиа-сервера, вернее, если быть точным, с минимальной его помощью. Задачей сервиса на стороне сервера (так называемый пировый сервер) является связь передающего и принимающего объектов на двух или нескольких компьютерах пользователей. Таким сервисом является Adobe Stratus. Подробнее от разработчиков (на английском естественно): http://labs.adobe.com/wiki/index.php/Stratus http://labs.adobe.com/wiki/index.php/Stratus:FAQ http://labs.adobe.com/technologies/stratus/
Итак что нужно, чтоб начать использовать Adobe Stratus. Первым делом необходимо зарегистрироваться на сайте Adobe.com , если конечно вы этого еще не сделали. Затем пойти на страничку проекта на AdobeLabs(http://labs.adobe.com/technologies/stratus/ ) и получить ключ разработчика (developer key ), в правой части страницы ссылка Signup for a Stratus beta developer key. Теперь о технике. Естественно, для успешного продолжения эксперимента ваш компьютер должен быть оборудован видеокамерой и микрофоном. Должна быть установлена версия Flash Player не ниже 10. Будем использовать Flex(Flash)Builder. C версией SDK не ниже 3.2. Если Вы по каким-то религиозным причинам не используете Flex, то подобный эксперимент можно провести и на Adobe Flash CS4 или любой другой IDE с разницей в реализации визуальных компонентов... И последнее. В Вашей системе (а так же в системах пользователей Вашего приложения) не должно быть ограничений по передаче UDP пакетов в адрес порта 1935 (такие ограничения может создавать брандмаузер, антивирусное приложение или прокси-сервер).
Для иллюстрации простейших возможностей этой технологии я создал небольшое приложение StratusTest (http://flexconstructor.ru/polygon/stratus/StratusTest.html ) исходный код приложения доступен по ссылке http://flexconstructor.ru/polygon/stratus/srcview/index.html , для Вас я подробно прокомментировал код, поэтому не буду повторять комментарии в формате поста блога. Расскажу только как оно работает. 1.Открываем приложение 2.Вводим имя пользователя паспорные данные, номер кредитки, ну можно и бойтись и какой-нибудь билебердой для начала, типа «fvbvsdfbvsdfbvdfb» 3.Выбираем будем ли мы инициаторами трансляции или подключимся к уже существующей (если таковая уже имеется). Будем инициатором. 4.Заходим в рабочее состояние приложения и разрешаем плееру использовать камеру и микрофон. Не обращаем внимание на предупреждение типа «Если Вы разрешите, то вас могут слушать и снимать». Небойтесь. Это тестовое приложение не использующее никаких серверных технологий, кроме пирового сервера AdobeStratus и никто за Вами не следит, потому, что кому вы нужны, как это ни печально звучит, а так же потому, что чтобы начать следить за Вами кому-то нужно угадать длиннющую строку, отображенную в верхней части окна под леблом My Peer ID. Эта строка генерируется экземпляром NetConnection, соединяющим вас с кем-либо знающим эту строку. В реальном приложении нам бы пришлось использовать какие либо сторонние методы для записи и публикации этой строки (например традиционно PHP+MySQL), т.к. Сервис AdobeStratus не предоставляет разработчикам никаких методов работы на стороне сервера. В нашем же случае передайте эту строку по аське, скайпу, электронной или голубинной почте вашему будущему абоненту и попросите его зайти по ссылке http://flexconstructor.ru/polygon/stratus/StratusTest.html , опять же ввести имя пользователя и ввести эту строку в поле Enter Peer ID и нажать кнопку Join. Вуаля. Есть контакт. Ваш абонент вас видит, слышит и может общаться с Вами по-средством чата в правой части панели приложения. 5.А можно просто открыть эту же ссылочку в новом окне браузера и насладиться, так сказать, самим собой. Вкратце как это устроено: С помощю этого тестогово приложения Вы можете являться либо инициатором конференции, либо ее участником. В любом случае, в первую очередь создается экземпляр NetConnection, образно говоря это некая труба по которой проходят потоки данных в ту и другую сторону. И подключается к сервису по адресу rtmfp://stratus.adobe.com/. Обратите внимание на то что название протокола RTMFP . Общее количество потоков, проходящих по этому каналу впринципе ограничено и по-умолчанию равняется восьми, однако это настраиваемый параметр (свойство экземпляра класса NetConnection maxPeerConnections открытое на чтение и запись), т.е. значение присвоенное этому параметру ограничено лишь пределами разумного. Далее, после успешного подключения к Stratus, если вы являетесь инициатором, то создается основной публикующий поток (еккземпляр класса NetStream ) _directStream=new NetStream(_netConnection,NetStream.DIRECT_CONNECTIONS) где netConnection- ссылка на экземпляр NetConnection NetStream.DIRECT_CONNECTIONS (новинка Flash p2p) строка определяющая, что данный поток является одноранговым. Объект-клиент этого потока (ну просто объект или экземпляр какого-нибудь специального класса, на ваш вкус, к которому приравнено свойство client публикующего потока) имеет метод onPeerConnect, вызывающийся при подключении воспроизводящего потока к публикующему, в качестве аргумента этого метода передается ссылка на воспроизводящий поток, т.е. на экземпляр класса NetStream, который будет воспроизводить, например медиаданные с основного потока, или ждать вызова определенных разработчиком методов в рамках своего клиента. Свойство ссылки на принимающий поток farID содержит строку соответствующую пиру вашего абонента. С помощью этой строки мы создадим слушающий поток, который будет принимать данные от клиента. var responder:NetStream=new NetStream(_netConnection,stream.farID); И тут хотелось бы обратить внимание на две особенность, попившие изрядно крови и на прямую не описанные ни в какой документации... ВНИМАНИЕ! Съел весьма неприятную собаку при организации обратного вызова слушающих потоков инициатора. Дело в том, что все потоки слушатели должны быть записаны в массив или каким-либо другим образом должны зафиксировать ссылку на себя в приложении, иначе GarbageCollector мигом грохнет ссылки на "неиспользующиеся потоки". И еще одну съел несколько раньше, при разработке реального приложения. Имена потоков подключенных клиентов должны быть уникальны, иначе все потоки, публикующие или слушающие потоки с одинаковыми именами будут закрыты.
Вариант поведения приложения в состоянии подключенного клиента организуем так же, с точностью до наоборот.
Вот вобщем-то и все. Подробнее описано в комментариях к коду. Если все плохо и ничего не работает, при этом не возникает никаких ошибок, или сразу после создания подключения выскакивает событие NetStatusEvent с кодом объекта info “NetStream.Connect.Closed” то это может иметь массу причин (в этом как раз и недостаток этой технологии), восновном связанные с блокировкой UDP трафика антивирусником или фаерволом в вашей системе. Уточнить причину неполадок поможет тестовое приложение, доступное по ссылке http://cc.rtmfp.net/ (не вдаваясь в подробности, скажу что для успешной работы необходимо, чтобы ни одна кнопочка не была красной).
Не смотря на явные недостатки этой технологии (о них я писал в прошлой статье), такие как например частая нестабильность работы сервиса Adobe Stratus, неопределенность в будущем этого сервиса, являющегося уже давольно давно бетта-версией, отсутствие технической поддержки и блокировка UDP трафика во многих системах пользователей, существует уверенность в том, что эта грань великого и ужасного Flash будет сильно востребована пользователями и разработчиками в ближайшем будущем, тем более, что в долгожданной, но до сих пор не вышедшей версии FlashPlayer10.1 (Сколько можно ждать!!!!), уже реализовано расширение возможностей API плеера в этом направлении, реализован целый новый класс flash.net.GroupSpecifier, с помощью чего планируется возможность создания одноранговых сетей, типа «многие ко многим», что поистине взрывает мозг flash-фантазерам и серьезным разработчикам социальных сетей нового поколения (вчера прочитал интересное обсуждение этого вопроса на сайте Flash-потрошителей). Кроме того, по слухам, новая версия Adobe Flash Media Server, так же будет в полной мере поддерживать одноранговые соединения и создание сетей на их основе. Возможно именно это направление спасет Flash от зубов всепоглощающего убийцы по имени HTML5. Ну, а пока, советую воздержаться разработчикам приложений, требующих особо-серьезного подхода к стабильности соединения от разработки на основе Adobe Stratus, но вот для создания 10000001 -го клона chatRoulette или корпоративной видео-телефонии (где сисадмину вполне подсилу настроить UDP трафик и открыть порт 1935 на машинах сети) это решение вполне подходит, более того является очень привлекательным из-за невысокого бюджета.
Комментарии: 13:
Очень интересная статья и много полезной информации
статья отличная, но вот сколько я ни пытался, не происходит событие onPeerConnect в CS4 - мистика да и только Возможно, Вы знаете причину этого досадного недоразумения ?
По ссылке класс для моего проекта в котором я это пробовал сделать http://divisionby0.org/stratus_test/stratusTest.as Не моглы бы Вы посмотреть ?
А можете объяснить, как ваш исходник залить на хостинг?
Нужно AS скрипт компилировать в swf, а потом флеш файл вставить на страницу?
Совершенно верно. Но если у Вас возникает такой вопрос, то советую обратиться к flash-технологу.
Раньше я работал только с PHP и при переходе к flash возникают непонятки.
Если скомпилировать проект в swf,
то мы получим один файл. И насколько я разбираюсь в этом, то swf это клиент.
А что тогда будет сервером? Сам SWF файл будет работать без сервака или же там ещё нужен скрипт сервера?
Или Adobe Stratus позволяет клиентам жить самостоятельной жизнью?
Клиенты работают, вобще, независимо от сервера, то есть серверного скрипта нет?
Этот комментарий был удален автором.
А как код компилировать?
Перекинул исходник в проект, то при компиляции выдал:
Error: a target file must be specified
Use 'mxmlc -help' for information about using the command line.
Build halted with errors (fcsh).
Ещё пробовал закинуть скрипт из StratusTest.mxml в main.mxml, тогда открывается приложение, белый экран и ничего.
Что не так? Как компилировать? Работал в FlashDevelop.
А нет, я уже во ФлексБилдере Всё скомпилировал, всё работает. Спасибо за исходник. Пока я с ним разбирался, то разобрался со системой и многому научился)))
Я рад, что оказался Вами полезен. И ценность Вашего опыта гораздо выше ценности этого исходника. На самом деле этот код уже значительно устарел, советую Вам разобраться с кодом, предоставленным адобовским евангелистом Томом Кирчей, у него подход по-свежее.
Хочу попросить разъяснить ситуацию с публикацией медиаданных, а именно - увеличивается ли нагрузка на исходящий канал юзера, который публикует данные при каждом новом подключении к нему следующем юзере?
Другими словами, дублируются ли потоки данных для каждого нового farId и куда вообще публикуется этот поток?
Спасибо.
Добрый день, Max Zh. Нагрузка на клиент сидера безусловно увеличивается с каждым подключенным линчером, однако, этот пример довольно стар и в прошлом комменте я ссылался на пример по-свежее, современные версии flash player,(начиная, кажется, с 10.1) поддерживают такую вещь, как мультикастинг , однако на все 100% это не решает. На мой взгляд, наиболее правильный подход (и это не удивительно:)) реализован в коробочном примере к Adobe FMS начиная с 4. Там сидером является Flash Media Server, однако это уже за деньги, причем за существенные деньги.
Благодарю за ответ!:)
Отправить комментарий
Подпишитесь на каналы Комментарии к сообщению [Atom]
<< Главная страница