我正在尝试放置一个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)。

最佳答案

如果您将Cirrus用于p2p,则仅将它们都连接到Cirrus根本无法帮助您。需要发生的是,一个人连接到Cirrus,并使用onConnected处理程序中的event.nearID从服务获取它所需的ID。您还需要指定Stream以便能够直接在2个客户端之间进行连接,如下所示:

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

这就是使事情变得有趣的地方,现在您需要将该ID传输到接收方。 Cirrus不会为您这样做。您需要提供服务以将其发送或手动输入。假设您确实手动输入,则接收端需要使用以下方法进行连接:

inStream = new NetStream(connection, cirrusID);

这样一来,这两个客户端就可以直接相互连接。

关于apache-flex - 无法使用Flex读取简单的Adobe Cirrus/Stratus传入流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5475821/

10-10 09:52