Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Передача звука идёт с большой задержкой в Р2Р (http://www.flasher.ru/forum/showthread.php?t=175381)

BerkutSoft 15.02.2012 20:47

Передача звука идёт с большой задержкой в Р2Р
 
Здравствуйте все!
Вот беда у меня беда.. начал писать аудиочат на основе технологии Р2Р. Я запускаю 2 одинаковых приложения на локальном компе. Вроде бы всё работает, звук передаётся и воспринимается, но воспроизведение звука по началу отстаёт на 3-4 секунды, но по истечению некоторого времени (от 1 до 5 минут) всё выравнивается и звук воспроизводится сразу как только я что либо говорю в микрофон. В чём может быть беда?
Код AS3:

<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" minWidth="955" minHeight="600"
                          applicationComplete="OnApplicationComplete()">
        <fx:Script>
                <![CDATA[
                        import mx.controls.Text;
                        private var netConnection:NetConnection;
                        private var netGroup:NetGroup;
                        private var netStream:NetStream;
                        private var speaker:NetStream;
                        private var groupspec:GroupSpecifier;
                        private var groupName:String;
                        private        const SERVER:String ='rtmfp://p2p.rtmfp.net/';
                        private        const DEVKEY:String = 'тут был мой ключ разраба';
                        function netStatusHandler(e:NetStatusEvent):void {
                                switch (e.info.code) {
                                        case 'NetConnection.Connect.Success':
                                                setupGroup();
                                                break;
                                        case 'NetStream.Connect.Success':
                                                // Create new NetGroup
                                        {netGroup = new NetGroup(netConnection, groupspec.groupspecWithAuthorizations());
                                                netGroup.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
                                        }
                                                break;
                                        case 'NetGroup.Connect.Success': OnNetStreamConnect();        break;
                                        case 'NetGroup.SendTo.Notify' :
                                                trace(e.info.message);        break;
                                        default:
                                }
                        }
 
                        private function OnNetStreamConnect():void
                        {
                                netStream.client = this;
                                var mic:Microphone = Microphone.getMicrophone();
                                if(mic)
                                {
                                        mic.codec = SoundCodec.SPEEX;
                                        mic.setSilenceLevel(0);
                                        netStream.attachAudio(mic);
                                        StatusMessage("Есть микрофон\n");
                                        netStream.publish("stream");
                                }
                        }
                        private function OnApplicationComplete():void
                        {        userName.text = "user " + int(Math.random() * 65536);
                                groupName ="BerkutSoft";
                                StatusMessage("Connecting to \"" + SERVER + "\" ...\n");
                                netConnection = new NetConnection();
                                netConnection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
                                netConnection.connect(SERVER + DEVKEY);
                                StatusMessage("--NetConnection--\n");
                        }
 
                        function setupGroup():void {
                                groupspec = new GroupSpecifier("bs/" + groupName);
                                groupspec.serverChannelEnabled = true;
                                groupspec.multicastEnabled = true;
                                groupspec.postingEnabled = true;
                                groupspec.routingEnabled = true;
                                groupspec.peerToPeerDisabled = false;
                                netStream = new NetStream(netConnection, groupspec.groupspecWithAuthorizations());
                                netStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
                                speaker = new NetStream(netConnection, groupspec.groupspecWithAuthorizations());
                                speaker.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
                                speaker.play("stream");               
                        }
 
                        private function StatusMessage(msg:Object):void
                        {
                                statusLog.text += msg;
                                statusLog.verticalScrollPosition = statusLog.textHeight;
                                statusLog.validateNow();
                        }
                ]]>
        </fx:Script>
 
        <s:TextInput id="userName" width="160" />
        <mx:TextArea id="statusLog" width="100%" height="100%"/>
 
</s:Application>


MikroAcse 15.02.2012 23:26

Как по мне, то проблема в том, что сейчас P2P еще не очень стабильный.

BerkutSoft 16.02.2012 09:18

Для меня это единственный вариант, делать передачу данных через сервер я не могу

sstotenkopf 16.02.2012 11:50

Проблема в net группах, зачем они вообще вам для p2p чата? Используйте direct connection проблема исчезнет....

BerkutSoft 17.02.2012 12:26

Это получается что на поток подписываются все клиенты, кто подключился через мой devkey? Но мне нужно как то распределять группы людей по разным комнатам. Если это возможно через direct connectio, то не могли бы подсказать в каком направлении капать? Пробовал по вот этому варианту, и действительно, звук идёт без задержек, но как на нём сделать различные комнаты, тут я никак не могу додуматься

dsQuadro 17.02.2012 12:52

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

BerkutSoft 17.02.2012 19:40

Цитата:

Сообщение от dsQuadro (Сообщение 1063603)
я это реализовал подключая людей к разным группам, а уже внутри группы люди обмениваются ключами у устанавливают прямые соединения друг с другом

Имеется в виду вот это - NetGroup.addNeighbor(peerID:String)? В мануале вот что написано: "Вручную добавляет соседний узел путем немедленного подключения непосредственно к указанному peerID, который уже должен быть добавлен в эту группу."
А как я узнаю что он действительно соседний? Или придётся соединять всех со всеми? И хорошо если в группе будет 5, 10, 15 человек, а если 1000? Это может нагнуть интернет канал всех участников, или я чего то не понимаю? Подскажите пожалуйста, как правильно соединить людей друг к другу на прямую в группе.

Добавлено через 67 часов 39 минут
Есть у кого ещё какие идеи? Никак не пойму как это реализовать.

BerkutSoft 25.02.2012 11:21

Р2Р Прямое соединение в группе. Как?
 
Пробовал метод NetGroup.addNeighbor(peerID:String), но проблему это не решило.

sstotenkopf 25.02.2012 22:43

Цитата:

Сообщение от BerkutSoft (Сообщение 1063598)
Это получается что на поток подписываются все клиенты, кто подключился через мой devkey? Но мне нужно как то распределять группы людей по разным комнатам. Если это возможно через direct connectio, то не могли бы подсказать в каком направлении капать? Пробовал по вот этому варианту, и действительно, звук идёт без задержек, но как на нём сделать различные комнаты, тут я никак не могу додуматься

В бд записывать айди пользователей, распределяя их по комнатам, в зависимости от запроса выдавать приложению массив пользователей и подключать их

BerkutSoft 01.03.2012 15:34

Цитата:

Сообщение от sstotenkopf (Сообщение 1065468)
В бд записывать айди пользователей, распределяя их по комнатам, в зависимости от запроса выдавать приложению массив пользователей и подключать их

Спасибо большое! Я пришёл к тому же решению, но думал найти решение без использования БД

dsQuadro 01.03.2012 16:37

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

BerkutSoft 03.03.2012 15:16

В общем я сделал вот так:
Отправляю мой PeerID всем кто есть сейчас в группе
Код AS3:

case "NetGroup.Neighbor.Connect": netGroup.post(netConnection.nearID);

Вещание в группу идёт вот таким образом
Код AS3:

//..........
netStream = new NetStream(netConnection, groupspec.groupspecWithAuthorizations());
netStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
//..........
var mic:Microphone = Microphone.getMicrophone();
netStream.attachAudio(mic);
netStream.publish("stream");

Если кто то прислал нам свой PeerID, то создаём поток подключающийся непосредственно к нему
Код AS3:

private function newIncomStream(peerID:String):void{
var num:int=IncomStream.length;
IncomStream[num]=new NetStream(netConnection,peerID);
IncomStream[num].addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);
IncomStream[num].play("stream");
}

где IncomStream:Vector.<NetStream> = new Vector.<NetStream>;
В общем это не работает. Такое ощущение что принимающий поток то он создаёт при получении ПирИД, но в потоке пусто. Можешь хотя бы кусочек своего примера показать? Что то я никак не догоню

dsQuadro 03.03.2012 20:30

так ты ничего и не сделал.. ты все тот же глючный групповой поток создаешь...

исходящий поток... такой только один:
Код AS3:

this.outputStream = new NetStream(this.netConnection, NetStream.DIRECT_CONNECTIONS);

сюда выводишь свой звук

входящие потоки:
Код AS3:

var inputSyream:NetStream = new NetStream(this.netConnection, peerID);

от них уже слушаешь все что приходит...

BerkutSoft 04.03.2012 15:22

Ох респектище тебе! Это действительно работает!!

BerkutSoft 08.03.2012 12:40

В очередной раз прочитал статью про Р2Р Multicast Explained in Flash 10.1 P2P и пришёл к выводу, что при подходе, который вы мне посоветовали получается Unicast, и он вполне себе подойдёт при не большом количестве людей, ну скажем 3-5, может чуть больше. А если в группе будет 1000 человек, то будет плохо.. Возможно вещание потоков через группы тормозит не по причине глючности групп, а по причине установления оптимальных связей в мультикаст режиме?
ЗЫ: Собственно меня смутил вот этот абзац, где говорится, что для мультикаста NetStream необходимо использовать с GroupSpecifier. Или я что то не правильно понимаю?
Цитата:

For Multicast in Flash we use NetStream class together with GroupSpecifier and NetConnection. Multicast is the most complicated thing in Flash P2P implementation and it’s very intelligent in optimizing the delivery, chunk distribution and mesh reforming. We have three types of multicast: P2P, IP and Fusion (P2P+IP). Multicast is available with Adobe Cirrus and more will be available with new FMS.


Часовой пояс GMT +4, время: 19:49.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.