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