Не удается прочитать простой входящий поток Adobe Cirrus/Stratus с помощью Flex
Я пытаюсь создать приложение Flex, которое позволяет пользователю отправлять видеопоток и позволять другим отображать его.
Я создал страницу отправителя (ниже). Код очень прост и отлично работает:
<?xml version="1.0" encoding="utf-8"?>
<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">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.core.UIComponent;
import mx.events.FlexEvent;
// Network properties
private var connection:NetConnection;
private var outStream:NetStream;
private var RTMFP_CODE:String = "A_CODE";
// Device properties
private var camera:Camera;
private var microphone:Microphone;
// Video properties
private var outVideo:Video;
// Flex components
private var outVideoWrapper:UIComponent;
protected function button1_clickHandler(event:MouseEvent):void
{
connection = new NetConnection();
connection.connect("rtmfp://p2p.rtmfp.net/" + this.RTMFP_CODE);
connection.addEventListener(NetStatusEvent.NET_STATUS, onConnected);
}
private function onConnected(event:NetStatusEvent):void{
if (event.info.code == "NetConnection.Connect.Success"){
setupVideo();
}
}
private function setupVideo():void{
// Setup outgoing devices
camera = Camera.getCamera();
microphone = Microphone.getMicrophone();
// Setup outgoing stream
outStream = new NetStream(connection);
outStream.attachCamera(camera);
outStream.attachAudio(microphone);
outStream.publish("flex_rocks");
// Setup outgoing video and attach outgoing devices
outVideo = new Video();
outVideo.attachCamera(camera);
// Wrap the video object
outVideoWrapper = new UIComponent;
outVideoWrapper.addChild(outVideo);
addElement(outVideoWrapper);
}
]]>
</fx:Script>
<s:Button x="885" y="0" label="Send video" click="button1_clickHandler(event)"/>
</s:Application>
Затем идет код страницы получателя (ниже):
<?xml version="1.0" encoding="utf-8"?>
<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">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.core.UIComponent;
import mx.events.FlexEvent;
// Network properties
private var connection:NetConnection;
private var inStream:NetStream;
private var RTMFP_CODE:String = "A_CODE";
// Device properties
private var camera:Camera;
private var microphone:Microphone;
// Video properties
private var inVideo:Video;
// Flex components
// private var inVideoWrapper:UIComponent;
protected function button1_clickHandler(event:MouseEvent):void
{
connection = new NetConnection();
connection.connect("rtmfp://p2p.rtmfp.net/" + this.RTMFP_CODE);
connection.addEventListener(NetStatusEvent.NET_STATUS, onConnected);
}
private function onConnected(event:NetStatusEvent):void{
Alert.show(event.info.code);
if (event.info.code == "NetConnection.Connect.Success"){
setupVideo();
}
}
private function setupVideo():void{
// Setup outgoing devices
camera = Camera.getCamera();
microphone = Microphone.getMicrophone();
// Setup incoming stream
inStream = new NetStream(connection);
inStream.play("flex_rocks");
// Setup incoming video and attach incoming stream
inVideo = new Video();
inVideo.attachNetStream(inStream);
// Wrap the video object
// inVideoWrapper = new UIComponent();
inVideoWrapper.addChild(inVideo);
addElement(inVideoWrapper);
}
]]>
</fx:Script>
<s:Button x="885" y="0" label="Receive a stream" click="button1_clickHandler(event)"/>
<mx:UIComponent id="inVideoWrapper" x="0" y="0" width="500" height="500">
</mx:UIComponent>
</s:Application>
Я не знаю, почему на странице получателя я не могу отобразить входящий поток? Я поставил простое предупреждение, чтобы показать возвращенный код подключения, он показывает "Успех".
Я делаю что-то неправильно?
С уважением.
(PS: я использую Flex Builder 4 под Windows 7 64 бит).
1 ответ
Если вы используете Cirrus для p2p, простое подключение обоих к Cirrus вам не поможет. Что должно произойти, так это то, что кто-то подключается к Cirrus, получает требуемый идентификатор от службы, используя event.nearID
в вашем обработчике onConnected. Вам также нужно указать поток, чтобы иметь возможность напрямую подключаться между двумя клиентами, например так:
outStream = new NetStream(connection, NetStream.DIRECT_CONNECTIONS);
И вот тут все становится интересным, теперь вам нужно передать этот идентификатор получателю. Cirrus не делает этого для вас. Вам нужно иметь сервис для отправки или ввода вручную. Допустим, вы вводите его вручную, тогда получающему концу необходимо подключиться, используя это:
inStream = new NetStream(connection, cirrusID);
А это, в свою очередь, соединит обоих клиентов напрямую друг с другом.