我正在尝试安装一个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。)
答案 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);
这将反过来将两个客户直接连接到另一个。