![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Apr 2013
Сообщений: 3
|
Добрый день!
При разработке видео чата возникла следующая проблема. Есть рабочая реализация видео чата через rtmp, которая работает отлично. Проблема появилась после переноса чата на rtmfp (сервер OpenRTMFP). Регистрация на сервере и обмен peerId работает как часики, но в некоторых случаях не происходит соединение между некоторыми пользователями, причем в случайным образом. К примеру, в разговоре из 4х человек, иногда, какая то из пар, не видит друг друга. Была попытка настройки TURN сервера, результатов она не дала. Кто то сталкивался с подобным? Получалось найти решения? |
|
|||||
|
Регистрация: Apr 2013
Сообщений: 3
|
Что имеется в виду под синхронной загрузкой данных?
Отправной точкой была взята следующая реализация http://www.adobe.com/devnet/adobe-me...aboration.html (из нее удален текстовый чат, а данные для входа передаются через flashvars) public function register(rtmp:Boolean):void { if (!((_user && _user.length > 0) && (_meeting && _meeting.length > 0))) { dispatchEvent(new Event(ERROR)); return; } var protocol:String; if (rtmp) { protocol = "rtmp://"; } else { protocol = "rtmfp://"; } _connection = new NetConnection(); _connection.addEventListener(NetStatusEvent.NET_STATUS, connectionHandler); try { _connection.connect(protocol + _host + "/meeting", _user, _meeting); } catch (e:Error) { _logger.debug("Argument error"); dispatchEvent(new Event(ERROR)); return; } if (!rtmp) { _rtmfpTimer = new Timer(5000, 1); _rtmfpTimer.addEventListener(TimerEvent.TIMER_COMPLETE, rtmfpTimeoutHandler); _rtmfpTimer.start(); } } private function rtmfpTimeoutHandler(e:TimerEvent):void { _logger.debug("RTMF connection timeout, using RTMP"); ExternalInterface.call('console.log', "RTMFP connection timeout, using RTMP"); dispatchEvent(new Event(CHANGE)); _connection.close(); _connection = null; register(true); } private function connectionHandler(e:NetStatusEvent):void { _logger.debug("Connection status: " + e.info.code); if (_rtmfpTimer) { _rtmfpTimer.stop(); _rtmfpTimer = null; } if ("NetConnection.Connect.Success" == e.info.code) { dispatchEvent(new Event(SUCCESS)); } else if ("NetConnection.Connect.Failed" == e.info.code) { dispatchEvent(new Event(FAILED)); } } Обмен участниками разговора происходит так: public function set connection(netConnection:NetConnection):void { if (!netConnection) { return; } _netConnection = netConnection; var o:Object = new Object(); o.participantChanged = function():void { updateParticipants(); } _netConnection.client = o; updateParticipants(); } Application cumulus взят отсюда https://github.com/OpenRTMFP/Cumulus...ation,-Samples Метод updateParticipants отправляет запрос на сервер Cumulus. Ответ обрабатывает метод private function participantsReceived(participants:Array):void { _logger.info("Participants: " + participants.length); var updateMedia:Boolean = false; // search for new participants for each (var p:Object in participants) { _logger.debug(p.userName); var exists:Boolean = false; for each (var e:Participant in _participants) { if (p.userName == e.userName) { exists = true; break; } } if (!exists) { // create a new participant _logger.info("Participants added: " + p.userName + ": " + p.protocol); var newParticipant:Participant = new Participant(_netConnection, p.farID, p.userName, p.protocol, p.userName == _userName); // Здесь создается поток получателя и выводится камера newParticipant.addEventListener(ParticipantEvent.FAILED_CONNECT, participantFailed); _participants.push(newParticipant); dispatchEvent(new ParticipantEvent(ParticipantEvent.ADD, newParticipant)); updateMedia = true; } } // search for participants that are removed for each (var n:Participant in _participants) { ……………………………………………………………….. } if (updateMedia) { updateMediaTopology(); } } if (SessionManager.MEDIA_CS == topology) { _netStream = new NetStream(_netConnection); } else if (SessionManager.MEDIA_DIRECT == topology) { _netStream = new NetStream(_netConnection, _id); } _video.attachNetStream(null); _netStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); _netStream.play(_userName); _video.attachNetStream(_netStream); if (!_outgoingStream) { _logger.info("Publishing media as: " + _currentMediaType); // attempt if (MEDIA_DIRECT == _currentMediaType) { _mediaState = MEDIA_CONNECTING; _connectionTimer.start(); } else { _mediaState = MEDIA_CONNECTED; } //_currentMediaType может быть MEDIA_DIRECT и MEDIA_CS(client/server) if (_currentMediaType == MEDIA_DIRECT) { _outgoingStream = new NetStream(_netConnection, NetStream.DIRECT_CONNECTIONS); } else { _outgoingStream = new NetStream(_netConnection); } _outgoingStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); var c:Object = new Object(); c.onPeerConnect = function(n:NetStream):Boolean { _logger.debug("Peer stream connected"); for each (var e:Participant in _participants) { if (n.farID == e.id) { e.connectStatus = Participant.CONNECTED; } } _mediaState = MEDIA_CONNECTED; _connectionTimer.stop(); return true; } _outgoingStream.client = c; } sendAudio = true; sendVideo = true; ........ public function set sendAudio(send:Boolean):void { _sendAudio = send; if (_outgoingStream) { if (send) { var microphone:Microphone = getMicrophone(); if (microphone) { microphone.setSilenceLevel(0); microphone.codec = _settings.codec; microphone.framesPerPacket = 1; microphone.encodeQuality = _settings.speexQuality; microphone.rate = _settings.nellymoserRate; _outgoingStream.attachAudio(microphone); } } else { _outgoingStream.attachAudio(null); } } } public function set sendVideo(send:Boolean):void { _sendVideo = send; if (_outgoingStream) { if (send) { _outgoingStream.attachCamera(Camera.getCamera(_settings.cameraIndex.toString())); } else { _outgoingStream.attachCamera(null); } } } Спасибо |
|
|||||
|
Регистрация: Apr 2013
Сообщений: 3
|
На сервер ставился следующий: https://code.google.com/p/rfc5766-turn-server/ . Без дополнительных настроек.
В коде изменений не делали, а на всех тестируемых машинах в mms.cfg добавили строку RTMFPTURNProxy=10.10.10.10 |
![]() |
![]() |
Часовой пояс GMT +4, время: 12:08. |
|
|
« Предыдущая тема | Следующая тема » |
|
|