Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.04.2013, 19:53
altname вне форума Посмотреть профиль Отправить личное сообщение для altname Найти все сообщения от altname
  № 1  
Ответить с цитированием
altname

Регистрация: Apr 2013
Сообщений: 3
The bomb! Проблема реализации видео чата через rtmfp

Добрый день!

При разработке видео чата возникла следующая проблема.
Есть рабочая реализация видео чата через rtmp, которая работает отлично.
Проблема появилась после переноса чата на rtmfp (сервер OpenRTMFP).

Регистрация на сервере и обмен peerId работает как часики, но в некоторых случаях не происходит соединение между некоторыми пользователями, причем в случайным образом. К примеру, в разговоре из 4х человек, иногда, какая то из пар, не видит друг друга.

Была попытка настройки TURN сервера, результатов она не дала.

Кто то сталкивался с подобным? Получалось найти решения?

Старый 19.04.2013, 08:23
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 2  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Слишком мало информации.
Напишите код соединения, подписывания и броадкастинга

Пальцем в небо - пара не успевает подписаться друг на друга, синхронная загрузка данных или еще что

Старый 19.04.2013, 18:38
altname вне форума Посмотреть профиль Отправить личное сообщение для altname Найти все сообщения от altname
  № 3  
Ответить с цитированием
altname

Регистрация: Apr 2013
Сообщений: 3
Что имеется в виду под синхронной загрузкой данных?

Отправной точкой была взята следующая реализация http://www.adobe.com/devnet/adobe-me...aboration.html (из нее удален текстовый чат, а данные для входа передаются через flashvars)

Код AS3:
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));
	}
}
Так создается объект netConnection(). Переменные _user, _meeting передаются через flashvars.


Обмен участниками разговора происходит так:
Код AS3:
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();
}
Сервер Cumulus присылает событие participantChanged при добавлении(удалении/изменении протокола[rtmp|rtmfp]) пользователя из разговора.

Application cumulus взят отсюда https://github.com/OpenRTMFP/Cumulus...ation,-Samples

Метод updateParticipants отправляет запрос на сервер Cumulus. Ответ обрабатывает метод
Код AS3:
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();
	}
}
Создание потока получателя

Код AS3:
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);
Публикация потока:
Код AS3:
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);
		}
	}
}
Вот выдержки из кода. Проблемы описаны в посте выше...

Спасибо

Старый 22.04.2013, 19:21
altname вне форума Посмотреть профиль Отправить личное сообщение для altname Найти все сообщения от altname
  № 4  
Ответить с цитированием
altname

Регистрация: Apr 2013
Сообщений: 3
На сервер ставился следующий: https://code.google.com/p/rfc5766-turn-server/ . Без дополнительных настроек.

В коде изменений не делали, а на всех тестируемых машинах в mms.cfg добавили строку
RTMFPTURNProxy=10.10.10.10

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:08.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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