8.7.通过摄像头将视频发送到FMS实例

8.71. 问题
我需要从用户的摄像机发送一个流到Flash Media Server (FMS) 实例,供一个聊天室或其他直播媒体应用程序。
8.7.2. 解决办法
通过使用flash.media.Camera.getCamera 方法捕获用户摄像机的视频流,附加摄像机到一个NetStream 并将被发送到的Flash Media Server 实例。使用NetStream 类publish 方法来发送一个特定名称的流到应用程序并处理它。
8.7.3. 讨论
publish 方法表明,一个Flash Media Server 已经通过NetConnection 类连接, NetStream 将发送信息到服务器。服务器对信息做什么处理依赖于应用程序。但是一些标志可以在publish 方法中设置,表明什么流信息将被服务器和Flash Player 处理。publish 方法有以下特性。
+展开
-ActionScript
publish(name:String = null, type:String = null):void

它的参数如下:
name:String (default = null)
一个字符串用来确定流,如果你传送false,publish 操作停止。客户端必须在它们呼叫NetStream.play 时通过这条相同的名称订阅这个流。

type:String (default = null)
一个字符串用来表示怎么发布流。有效的值有record,append,live (默认值)。如果你传送record,Flash Player 发布并记录直播的数据,保存记录的数据到一个名称和传送name 参数相配值的新的FLV 文件。该文件存储在服务器上一个包含服务器端程序的目录内的子目录中。如果文件已经存在,它将被覆盖。如果你传送append,Flash Player 发布和记录直播数据,附加纪录的数据到一个名称和传送name 参数相配值的新的FLV 文件,存储在服务器上一个包含服务器端程序的目录内的子目录中。如果没有符合name 参数的文件,将创建一个新的文件。如果你省略参数或传送live,Flash Player 发布直播数据但不纪录它。

如果有文件存在并且名称符合传送的name 参数值,他将被删除。

当你使用Flash Media Server 纪录流时,服务器创建一个FLV 文件并存储在服务器上服务器端程序所在目录内的一个子目录中。每一个流都保存在一个名称符合NetConnection.connect.传送的应用程序实例名称的目录中。服务器自动创建目录,你不需要去为每个应用程序实例创建。如下例,下面的代码显示,你如何连接一个特定的应用程序实例,存储在你应用程序目录中的一个名称为lectureSeries 的目录中。一个名称为lecture.flv 的文件存储在/yourAppsFolder/lectureSeries/streams/Monday 子目录中:
+展开
-ActionScript
var myNC:NetConnection = new NetConnection();
myNC.connect("rtmp://server.domain.com/lectureSeries/Monday");
var myNS:NetStream = new NetStream(myNC);
myNS.publish("lecture""record");

如果你没有传送一个符合实例名称的值,被传送的name 属性值被储存在一个名称为/yourAppsFolder/appName/streams/_definst_ (默认值)子目录中。

这个方法可以触发一个带有几个不同信息对象的netStatus 事件。如下例,如果有人已经发布了一个特定名称的流,一个带有NetStream.Publish.BadName 的code 属性的netStatus 事件被触发。更多的信息,参考netStatus 事件。

下面的例子中,服务器连接已经建立,数据流从摄像机传送到服务器。
+展开
-XML
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxmlwidth="400"
height="500creationComplete="setUpCam()">

<mx:Script>
<![CDATA[
private var cam:Camera;
private var nc:NetConnection;
private var ns:NetStream;
private function setUpCam():void
{
trace(Camera.names.join(","));
//I'mdoingthisonlybecauseit's the only way the
//flash player will pick up the camera on my MacBook
cam = flash.media.Camera.getCamera("2");
vid.attachCamera(cam);
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS,
netStatus);
nc.connect("http://localhost:3002");
}
private function netStatus(event:NetStatusEvent):void
{
switch(event.info)
{
case "NetConnection.Connect.Success":
ns = new NetStream(nc);
ns.attachCamera(cam, 20);
ns.attachAudio(Microphone.getMicrophone());
ns.publish("appname""live");
break;
}
}

]]>
</mx:Script>
<mx:VideoDisplay id="vidwidth="360height="320"/>
</mx:Canvas>

加支付宝好友偷能量挖...


评论(0)网络
阅读(144)喜欢(0)flash/flex/fcs/AIR