Аудиочат на Adobe ActionScript
Четверг, 4 июля 2013 г.
Просмотров: 13022
Настроение: Хорошее
В колонках звучит: Не ниче не играет)))
Подписаться на комментарии по RSS
Некоторое время назад я начал изучать adobe actionscript, первое что мне понравилось, так это то, что язык очень похож на мне известный php и javascript, хотя различия имеются - например чтобы вывести на экран сообщение в php можно воспользоваться функцией echo, или print, для javascript - alert, а для actionscript - alert.show, или для режима отладки trace.
Изначально почему я взялся за этот язык, мне понадобилась программка на flash, которая объединяла бы голосовым чатом 5 человек, но так как мне пообещали ее написать, я не торопился с изучением этого вопроса.
Обещанного 3 года ждут..
Посмотрел вводных видео уроков по actionscript, и начал искать информацию о том как объединить мне пользователей в p2p сеть.
В интернете есть множество примеров текстовых чатов, видеоконференций, а вот просто аудиочатов не встречал))).
Во общем нашел несколько неплохих примеров видео-конференций и детально изучил их. Мне сразу стало понятно что в поток отдельно передается видео, и отдельно аудио данные. Удалив код связанный с камерой и передачей видео, я получил то что мне было нужно, правда мне после этого пришлось еще долго повозиться, и вникнуть как происходит процесс обмена данными, прежде чем у меня получилось что-то стоящее, и без глючное.
Код для Adobe Flash Builder
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" width="215" height="138" minWidth="215" minHeight="50" maxWidth="215" maxHeight="138" backgroundColor="#B6A6A6" pageTitle="Аудио чат"> <fx:Style source="Main.css"/> <fx:Script> <![CDATA[ //Здесь мы импортируем используемые библиотеки в нашем коде import mx.collections.ArrayCollection; import mx.controls.Alert; import mx.events.FlexEvent; import mx.rpc.events.ResultEvent; //далее объявляем переменные и прочее private const STRATUS_ADDR:String = "rtmfp://stratus.rtmfp.net/"; private const DEVELOPER_KEY:String = "ключ разработчика"; public var netConnection:NetConnection = new NetConnection(); public var sendStream:NetStream; public var streamDict:Dictionary = new Dictionary(); public var myroom:String; public var username:String; public var idList:Array = new Array('000'); public var clearList:Array = new Array('000'); //далее пошли функции //функция инициализации нового соединения public function initAll():void{ //максимальное количество одновременно подключеных пользователей netConnection.maxPeerConnections = 5; netConnection.addEventListener(NetStatusEvent.NET_STATUS,netHandler); netConnection.connect(STRATUS_ADDR+DEVELOPER_KEY); //отправляем свой идентификатор в p2p сети, //для того чтобы другие пользователи смогли к нам подклюбчиться peerService.send({peer: netConnection.nearID}); //очищаем список с пользователями с которыми мы устанавливали соединения //это нужно для переподключения к сети idList = clearList; } //функция обработки ответа на установку соединения с сервером adobe для нашей идентевикации в p2p сети private function netHandler(event: NetStatusEvent):void{ for (var key:* in event.info) switch (event.info.code){ case "NetConnection.Connect.Success": initSendStream(); break; case "NetConnection.Connect.Failed": Alert.show('Не получается подключиться в Adobe.Stratus.\n' + 'Скорее всего проблема связана с настройками файервола', 'Проблема с подключением'); break; case "NetStream.Connect.Closed": if (streamDict[event.info.stream] != undefined) delete streamDict[event.info.stream]; break; } } //если все ок в подключении, продолжаем отсюда //здесь мы инициализируем микрофон и начинаем свою трансляцию в сеть public function initSendStream():void{ sendStream = new NetStream(netConnection, NetStream.DIRECT_CONNECTIONS); sendStream.attachAudio(Microphone.getMicrophone()); sendStream.publish('media'); var client: Object = new Object(); client.onPeerConnect = function(callerNS:NetStream):Boolean { callerNS.send('hello', netConnection.nearID ,username); var cl2:Object = new Object(); cl2.imnew = function(senderID: String):void{ connectTo(senderID); }; callerNS.client = cl2; return true; }; sendStream.client = client; } //эта функция подключает нас к потоку нашего собеседника public function connectTo(peerID:String):Boolean{ //Здесь пришлось написать функцию для того чтобы запоминать всех с кем мы уже устанавливали соединение //иначе мы будем снова и снова подключаться к одним и темже for (var i:String in idList){ if ((idList[i]) == peerID) { return false; } }; initRecieveStream(peerID); idList.push(peerID); return true; } //здесь мы начинаем у себя воспроизводить поток нашего собеседника public function initRecieveStream(peerID:String):void{ var rec:NetStream = new NetStream(netConnection, peerID); rec.addEventListener(NetStatusEvent.NET_STATUS, function(event:NetStatusEvent):void{}); rec.play('media'); } //эта функция отвечает за результат выполненного запроса на наш сервер //здесь мы узнаем в какой комнате мы находимся и кто со мной рядом //также здесь я получаю свое имя в сети protected function peerService_resultHandler(event:ResultEvent):void { myroom = event.result.room; username = event.result.username; for each(var peer:XML in event.result.peer){ connectTo(peer.text()); } } //функция действия по передвижению ползуна на рабочей области (вкл/выкл) protected function hslider1_changeHandler(event:Event):void { if(onoff.value == 0) { //здесь мы закрываем соединение netConnection.close(); sendStream.close(); }else{ //а здесь наоборот начинаем коннектится))) initAll(); } } ]]> </fx:Script> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here flash-p2p.appspot.com--> <s:HTTPService id="peerService" url="некоторый адрес с которого мы получаем данные о комнате, и кто в ней находится" resultFormat="e4x" result="peerService_resultHandler(event)" showBusyCursor="true"/> </fx:Declarations> <s:HSlider id="onoff" x="44" y="4" width="137" height="22" change="hslider1_changeHandler(event)" liveDragging="true" maximum="1" minimum="0" stepSize="1" value="0"/> <s:Label x="10" y="8" fontFamily="Georgia" fontSize="12" fontStyle="normal" fontWeight="normal" lineThrough="false" text="Выкл" textDecoration="none"/> <s:Label x="182" y="9" fontFamily="Georgia" text="Вкл"/> </s:Application>
Я привел пример, на основе которого можно сделать более продвинутую версию чата.
Для игры Менеджер онлайн я сделал именно так, как пример приведу скриншоты рабочего чата.
Во время написания программки, я столкнулся с таким моментом, что когда происходит инициализация микрофона и камеры, требуется действие со стороны пользователя - разрешать ли flash'у использовать периферию, или нет.
Фишка заключается в том что в момент запроса действия у пользователя, всплывает окно настроек в самом flash и если для этого окна не хватает места, то оно попросту не появляется, и настройки становятся недоступны, а по умолчанию идет запрет на пользованием периферии. В спецификации к флешу сказано что для окна настроек, размер рабочей области должен составлять не меньше 138х215, иначе оно будет недоступно.
Комментариев: 21
АЛександр, так то ценная весч получилдась. Только вот не знаю, куда этот код импортировать и во что коп=мпилировать ? Черканули бы пару слов. Очень благодарен был бы.
Привет, ты срашивал про
переменные -
1 private const STRATUS_ADDR:String = rtmfp://stratus.rtmfp.net
2 private const DEVELOPER_KEY:String = ключ разработчика
1)это сервер самого сервиса adobe,
2)ключ разработчика ты получаешь бесплатно, зарегистрировавшиcь на сайте adobe.com, я точно не помню где и что там, но помоиму тебе ключ дают сразу, он будет использоваться во всех твоих проектах.
Программу компилировал как и писал, в Adobe Flash Builder, к сожалению у меня на компе нет установленной версии, но там нужно выбирать создать новый проект -> action script3. У тебя должно появиться окно ввода кода проекта, там и нужно вводить.
Оперативно
АГа. Сечас ...
Просто повезло что я был в сети))).
А давай, я терминальный тебе предоставлю быстренько, помоги, покажи, что к чему в программе ? Я чем могу - к твоим услугам.
Ммм это как? через удаленный рабочий стол что-ли?, тогда напиши на почту данные, помогу.
Перемудрил я что то ))) Тим вевер есть ?
Нет, нету, и я не знаю что это за программа))
Послал на почту )))
Длагодарю, за активную интерактивную оперативную помощь )) Дальше сам.
)) ТУт вот ошибка. Где эта ЦСС должна лежать ? Код ее не находит
Эту ЦСС код не находит. Где она должна быть ?
Пока просто удалил строку. Взлетело )
Попробуй проект свой сначала сохранить, если не поможет, удали эту строку. Там все эти файлы должны автоматически генерироваться
Здравствуйте, помогите мне пожалуйста кто нибудь! Я хочу сделать онлайн аудио или видео чат у себя на сайте. Ну что бы например... Человек заходит на страницу и видит чат, он его запускает и общается с теми людьми кто ещё есть в чате. То есть мне нужен онлайн аудио или видео чат для того, что бы посетители моего сайта общались между собой. Кто нибудь знает как такое сделать? Я бы хотел например... ну чтобы просто на сайт вставил какой нибудь файл SWF и что бы при клике по нему и происходило всё это. Я плохо во всём этом разбираюсь но как я понимаю такое в принципе возможно. Так что если есть тут сверхразумные люди, то пожалуйста подскажите как такое сделать.
Tails Prower, ну я даже не знаю, ты текст статьи то хоть прочитал?
В ней я даже вставил рабочий код программы, просто скопируй его, вставь себе в программу и скомпилируй. В комментариях выше есть информация как получить ключ разработчика. Как сделаешь что нибудь, я тебе дальше помогу, если будут вопросы еще.
Это Роман, который
2013-11-07 в 00:39:18 | Роман
Потерял то, что вы мне высылали. И я не помню, что )))
Помоему речь шла об index.html.
Решил вот вернуться к этой теме сильно поумневшим , но вообще застрял.
Скомпилил все, залил на хостинг - открывается пустая страница, красивого backgroundColor="#B6A6A6"и ни каких элементов управления ...
А раньше как то открывалось все нормально. Чето с умом видать перебор ...
Роман а у меня к сожалению наоборот)))), я несколько отупел:-D, я сам не помню все что там нужно делать, так как в actionscript я больше не работал, но html документ программа помоиму сама должна сгенерировать там она и пропишет что подключаемый объект это flash ролик или как то так, если не получится самому разобраться, то советую поискать в интернете как вставить actionscript ролик в html документ, ну или что то в этом направлении.
Да, с компиляцией того, что есть разобрался. Проект компилится, на хостинг выливаю, вроде запуск идет корректно, панель появляется ч ползунком, ползунок появляется и работает.
А вот, что дальше - нипанимаю.
Что то не хватает. Где то на интерфейсе ведь должно быть окно (инпут) с отображением соседей и выбора для подключения.
Не соображу в каком месте кода это отражено.
Найти не могу.
А ты сделал обработчик на php? и вставил адрес до него сюда
Честно не могу щас сразу сказать что обработчик должен выдавать, помоиму при каждом обращении к нему флеш отправляет к нему свой идентификатор в p2p сети и название комнаты, а скрипт в ответе должен выдавать построчно идентификаторы тех кто находится в этой же комнате. А имена переменных помоиму room и username которые скрипт отправляет.