Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Передача и вопроизведение видео через P2P (http://www.flasher.ru/forum/showthread.php?t=195247)

Фенёк 03.03.2013 02:39

Передача и вопроизведение видео через 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?

AlexCooper 03.03.2013 02:52

Для начала

Код 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

KumoKairo 03.03.2013 11:40

AlexCooper, а что понимается под live вещанием?
Через медиа сервер, или это другой тип подключения через Циррус?

AlexCooper 03.03.2013 13:55

да нужно Медиа Сервер. В некоторых сетях UPD соединения могут блокироваться сис. админами потому нужно переходить на Медиа сервер в случае отсутствия Р2Р

Фенёк 03.03.2013 16:07

в тестовом режиме хочу подключиться к самому себе, пишу:
Код 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);
                }

вешал трейс, метод выплняется, но никакого видео я все равно не вижу. я что-то пропустил?

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

AlexCooper 03.03.2013 21:25

Нет разницы что вы хотите транслировать. Я бы на вашем месте, создал все таки две флешки и проводил тесты подключаясь из одной в другую. Из IDE пытаетесь подключиться к видео а в скомпилированной ехе транслируете поток.

Фенёк 04.03.2013 12:39

А принципиально, чтобы была 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);

и к моему величайшему удивлению я опять ничего не вижу. Поясните пожалуйста в чем я не прав?

viclight 05.03.2013 02:04

атачте камеру напрямую в видео, а не публикующейся поток.
video.attachCamera(camera);

Фенёк 05.03.2013 12:20

окей, а как тогда поступить с принимающей стороной? Там же видео нужно по идее коннектить к потоку, верно?

yasha005 05.03.2013 19:42

Незнаю, может не в тему будет, но вот тут можно скачать свободно распространяемые исходники текстового чата на основе p2p:

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

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


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

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