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

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

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

Регистрация: May 2011
Сообщений: 221
Question Передача и вопроизведение видео через P2P

Хочу организовать передачу видео через Cirrus так, чтобы при этом во флешке передатчике тоже отображалось видео.

В документации написано что все просто, создаете NetConnection, конектите его, в нем создаете NetStream, аттачите видео к нетСтриму и запускаете нетСтрим на воспроизведение.

Скажем так, пример из документации скомпилить мне удалось, но вот рпи попытке перенести эту ту же логику в свой проект успехом не увенчалась.

Вобщем, расскажу поподробнее чего сделал.

завел отдельный класс для соединений со статическим инициализатором
Код AS3:
		public static function init():void
		{
			netConnection = new NetConnection();
			netConnection.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
			netConnection.connect("rtmfp://p2p.rtmfp.net", CIRRUS_KEY);
		}
создал в нем обаботчик событий

Код AS3:
private static function onStatus(event:NetStatusEvent):void
		{ 
			switch(event.info.code)
			{ 
			case "NetConnection.Connect.Success":
				onConnect();
				break; 
 
			case "NetStream.Play.StreamNotFound":
        		        trace("Unable to locate video");
              			break;
			} 
		}
на коннект создаю стрим и группу и отправляю событие на обработку делегату
Код AS3:
private static function onConnect():void
		{
			var groupSpecifier:GroupSpecifier = new GroupSpecifier(GROUP);
			groupSpecifier.multicastEnabled = true;
			groupSpecifier.postingEnabled = true;
			groupSpecifier.serverChannelEnabled = true;
 
			netStream = new NetStream(netConnection, groupSpecifier.groupspecWithAuthorizations());
			netStream.client = new CustomClient();
			netStream.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
 
			netGroup = new NetGroup(netConnection, groupSpecifier.groupspecWithAuthorizations());
			netGroup.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
 
			delegate.onConnect();
		}
делегат собирает у себя объект видео, размещает его в списке отображения и отдает управление обратно объекту клиенту

Код AS3:
			var video:Video = new Video();
			addChild(video);
			Cirrus.playVideo(video, videoURL);
и класс клиент прикрепляет видео к потоку, после чего запускает воспроизведение
Код AS3:
		public static function playVideo(video:Video, videoURL:String):void
		{
			video.attachNetStream(netStream);
            		netStream.play(videoURL);
		}
Ну и вобщем-то СЮРПРИЗ! Ничего не работает. Даже ошибок нет.

Объясните пожалуйста, что я делаю не так, видимо я не въезжаю в логику происходящего. Попутно хотелось бы уточнить, правильно ли я понимаю, что трансляция видео файла будет осуществляться с помощью метода netStream.publish?

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

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Для начала

Код AS3:
public class ReciverAPI extends Sprite {
 
private const SERVER_ADDRESS:String = "rtmfp://stratus.adobe.com/";
private const DEVELOPER_KEY:String = "ваш_ключ";
подключение с цирусу
Код AS3:
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS,ncStatus);
nc.connect(SERVER_ADDRESS+DEVELOPER_KEY);
создание вещания
Код AS3:
private function ncStatus(event:NetStatusEvent):void{
 
			txt.appendText('ncStatus'+event.info.code+"\n");
 
				trace(event.info.code);
 
				myPeerID = nc.nearID;
 
				if (event.info.code == 'NetConnection.Connect.Success' ) {
					initBroadcast();
 
				}
 
				trace("myPeerID: "+myPeerID);
		}
 
 
 
		private function initBroadcast():void {
 
				trace("initSendStream");
 
				txt.appendText("initBroadcast\n");
 
				broadcast = new NetStream(nc,NetStream.DIRECT_CONNECTIONS);
				broadcast.addEventListener(NetStatusEvent.NET_STATUS, broadcastHandler);
				broadcast.publish("channel");
 
 
				var broadcastClient:Object = new Object();
 
				broadcastClient.onPeerConnect = function(callerns:NetStream):Boolean {
 
					txt.appendText("broadcast onPeerConnect\n"+callerns.farID+"\n");
 
					farPeerID = callerns.farID;
 
					trace("onPeerConnect "+farPeerID);
 
					return true;
				}
 
				broadcast.client = broadcastClient;
 
				sendMyPeerId();
 
 
		}
функция sendMyPeerId - означает то что вам нужно либо передать либо сохранить полученный пир-адресс, по которому остальные будут подключаться для просмотра вещания.

в приемнике точно так же подключаетесь к цирусу, но вы не создаете вещание, а присоединяетесь к полученному
Код AS3:
myPeerID
примерно так
Код AS3:
public function active(peerId:String):void {
			txt.appendText(peerId+"\n");
 
			try {
				recvStream = new NetStream(nc,peerId);
 
				recvStream.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);
				recvStream.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
				recvStream.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorHandler);
				recvStream.play("channel");
 
				recvStream.client = this;
			} catch (e:Error) {
				txt.appendText("error"+e+"\n");
			} catch (e:SecurityError) {
				txt.appendText("SecurityError"+e+"\n");
			}
 
			txt.appendText("connection\n");
		}
Добавлено через 2 минуты
для полной связи между двумя клиентами нужно создавать для каждого вещание и множество слушателей.

Добавлено через 9 минут
И да... Есть множество людей у которых Р2Р не будет работать, примерно 30% от трафика нужно автоматически переводить на live
__________________
return this...

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

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
AlexCooper, а что понимается под live вещанием?
Через медиа сервер, или это другой тип подключения через Циррус?

Старый 03.03.2013, 13:55
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 4  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
да нужно Медиа Сервер. В некоторых сетях UPD соединения могут блокироваться сис. админами потому нужно переходить на Медиа сервер в случае отсутствия Р2Р
__________________
return this...

Старый 03.03.2013, 16:07
Фенёк вне форума Посмотреть профиль Отправить личное сообщение для Фенёк Найти все сообщения от Фенёк
  № 5  
Ответить с цитированием
Фенёк

Регистрация: May 2011
Сообщений: 221
в тестовом режиме хочу подключиться к самому себе, пишу:
Код AS3:
		public static function playVideo(video:Video, videoURL:String):void
		{
			var stream:NetStream = new NetStream(netConnection, netConnection.nearID);
			stream.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
			video.attachNetStream(stream);
			stream.play(videoURL);
		}
вешал трейс, метод выплняется, но никакого видео я все равно не вижу. я что-то пропустил?

Ах да, для внесения ясности, я хочу транслировать видеофайл


Последний раз редактировалось Фенёк; 03.03.2013 в 16:44.
Старый 03.03.2013, 21:25
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 6  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Нет разницы что вы хотите транслировать. Я бы на вашем месте, создал все таки две флешки и проводил тесты подключаясь из одной в другую. Из IDE пытаетесь подключиться к видео а в скомпилированной ехе транслируете поток.
__________________
return this...

Старый 04.03.2013, 12:39
Фенёк вне форума Посмотреть профиль Отправить личное сообщение для Фенёк Найти все сообщения от Фенёк
  № 7  
Ответить с цитированием
Фенёк

Регистрация: May 2011
Сообщений: 221
А принципиально, чтобы была exe?

И да, кстати, насчет трасляции файла, я так понял что его нужно будет транслировать через метод appendBytes. Хотел бы уточнить насколько это так и поинтересоваться нет ли какого примера по этому.

Добавлено через 12 часов 33 минуты
Посмотрел исходники официального приложения Cirrus, и если честно вообще впал в ступор, там по какой-то причине публикация и проигрывание ведется на разные каналы
Код AS3:
outgoingStream.publish("media-caller");
Код AS3:
incomingStream.play("media-callee");
код приложения довольно объемный, так что вероятно конечно я что-то где-то и путаю,но как факт исходные данные выглядят именно так.

Честно говоря меня совершенно сбивает с толку вся эта логика.

Например я попытался транслировать видео с камеры в поток и попутно показывать то, что отправляется с камеры в экземпляре класса Video

Код AS3:
var camera:Camera = Camera.GetCamera();
var netStream:NetStream = new NetStream(netConnection, NetStream.DIRECT_CONNECTIONS);
netStream.attachCamera(camera);
netStream.publish("stream");
var video:Video = new Video();
video.attachNetStream(netStream);
addChild(video);
и к моему величайшему удивлению я опять ничего не вижу. Поясните пожалуйста в чем я не прав?

Старый 05.03.2013, 02:04
viclight вне форума Посмотреть профиль Отправить личное сообщение для viclight Найти все сообщения от viclight
  № 8  
Ответить с цитированием
viclight

Регистрация: Mar 2007
Сообщений: 39
атачте камеру напрямую в видео, а не публикующейся поток.
video.attachCamera(camera);

Старый 05.03.2013, 12:20
Фенёк вне форума Посмотреть профиль Отправить личное сообщение для Фенёк Найти все сообщения от Фенёк
  № 9  
Ответить с цитированием
Фенёк

Регистрация: May 2011
Сообщений: 221
окей, а как тогда поступить с принимающей стороной? Там же видео нужно по идее коннектить к потоку, верно?

Старый 05.03.2013, 19:42
yasha005 вне форума Посмотреть профиль Отправить личное сообщение для yasha005 Найти все сообщения от yasha005
  № 10  
Ответить с цитированием
yasha005
[+1 16.03.13]
[+1 22.03.13]

Регистрация: Dec 2012
Сообщений: 100
Незнаю, может не в тему будет, но вот тут можно скачать свободно распространяемые исходники текстового чата на основе p2p:

http://code.google.com/p/team-pomodo...ebia/pomodoro/

Добавлено через 7 минут
и кстати, статеичка, поясняющая суть чата на p2p: http://habrahabr.ru/sandbox/43059/

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

Теги
cirrus , netconnection , netstream , p2p , video
Опции темы
Опции просмотра

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

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


 


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


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