无法使用Flex阅读简单的Adobe Cirrus / Stratus传入流

时间:2011-03-29 16:31:17

标签: flex stream stratus adobe-cirrus

我正在尝试安装一个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:我在Windows 7 64位下使用Flex Builder 4。)

1 个答案:

答案 0 :(得分:2)

如果您正在使用Cirrus进行p2p,那么只要连接到Cirrus都无法帮助您。需要做的是连接到Cirrus,使用onConnected处理程序中的event.nearID从服务获取所需的ID。您还需要指定Stream才能在两个客户端之间直接连接,如下所示:

outStream = new NetStream(connection, NetStream.DIRECT_CONNECTIONS);

这就是事情变得有趣的地方,你现在需要将这个ID传递给接收者。 Cirrus不会为你做那件事。您需要有一个服务来发送或手动输入。假设您手动输入,接收端需要使用此连接:

inStream = new NetStream(connection, cirrusID);

这将反过来将两个客户直接连接到另一个。