Юзаем 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 на машинах сети) это решение вполне подходит, более того является очень привлекательным из-за невысокого бюджета.