首页 > 设计 > WEB开发 > 正文

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

2023-07-29 15:25:56
字体:
来源:转载
供稿:网友
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>
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表