Flash/Flex学习笔记(12):FMS 3.5之如何做视频实时直播
硬件条件:一个摄像头 + 一台FMS服务器即可
原理:摄像头实时采集视频源,然后推送到FMS服务器,其它客户从FMS上获取视频流。
需要做二个fla,一个用于向FMS服务端推送视频源(即发送端),一个用于从FMS服务器获取并播放视频(即接收端)
Server.fla关键代码:
01 var cam:Camera;
02 var vod:Video;
03 var intervalId:uint;
04 var intelvalTimes:uint=0;
05 var isWorked=false;
06 var nc:NetConnection;
07 var ns:NetStream;
08
09 btnPublish.addEventListener(MouseEvent.CLICK,btnPublishClick);
10 lblMsg.text = "连接好摄像头后,\n点击下面的按钮"
11
12 //摄像头有活动时,被触发
13 function camActivityHandler(e:ActivityEvent) {
14 trace(e);
15 if (!isWorked) {
16 intervalId=setInterval(checkCallBack,100);
17 }
18 }
19
20 function checkCallBack():void {
21 intelvalTimes+=1;
22 trace(intelvalTimes);
23 if (cam.currentFPS>0) {
24 lblMsg.text="摄像头工作正常!";
25 isWorked=true;
26 clearInterval(intervalId);
27 ns.publish("myCamera", "live");
28 //同时处理本地播放
29 vod = new Video();
30 vod.attachCamera(cam);
31 vod.height=cam.height;
32 vod.width=cam.width;
33 vod.x = 45;
34 vod.y = 15;
35 addChild(vod);
36 } else {
37 if (intelvalTimes>=10) {//持续检测2秒,仍然无图象的话,认为"设备无法使用(占用中)"
38 lblMsg.text="设备无法使用(有可能被占用)";
39 clearInterval(intervalId);
40 }
41 }
42 }
43
44 //用户选择"同意"或"不允许"使用摄像头时触发
45 function statusHandler(e:StatusEvent) {
46 trace(e);
47 if (e.code=="Camera.Muted") {
48 lblMsg.text="您不允许使用摄像头!";
49 } else if (e.code == "Camera.Unmuted") {
50 lblMsg.text="摄像头视频获取中...";
51 }
52 }
53
54 //推送按钮点击事件
55 function btnPublishClick(e:MouseEvent) {
56 nc = new NetConnection();
57 nc.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);
58 nc.connect("rtmp://fms服务器ip地址/camlive");
59 }
60
61 //连接状态处理代码
62 function NetStatusHandler(event:NetStatusEvent):void {
63 trace(event.info.code);
64 if (event.info.code=="NetConnection.Connect.Success") {
65 cam=Camera.getCamera();
66 if (cam==null) {
67 this.lblMsg.text="未安装摄像头!";
68 return;
69 }
70 cam.addEventListener(StatusEvent.STATUS, statusHandler);
71 cam.addEventListener(ActivityEvent.ACTIVITY,camActivityHandler);
72 ns=new NetStream(nc);
73 ns.attachCamera(cam);
74 }
75 }
Client.fla关键代码:
01 var nc:NetConnection;
02 var ns:NetStream;
03 var vod:Video;
04
05 btnReceive.addEventListener(MouseEvent.CLICK,function(){
06 nc = new NetConnection();
07 nc.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);
08 nc.connect("rtmp://fms服务器ip地址/camlive");
09 })
10
11 //连接状态处理代码
12 function NetStatusHandler(event:NetStatusEvent):void {
13 trace(event.info.code);
14 if (event.info.code=="NetConnection.Connect.Success") {
15 lblMsg.text = "正在获取视频..."
16 ns=new NetStream(nc);
17 ns.addEventListener(NetStatusEvent.NET_STATUS,nsNetStatusHandler);
18 ns.play("myCamera");
19 vod = new Video();
20 vod.x=45;
21 vod.y=15;
22 vod.height=120;
23 vod.width=160;
24 vod.attachNetStream(ns);
25 addChild(vod);
26 }
27 }
28
29 function nsNetStatusHandler(e:NetStatusEvent){
30 trace(e.info.code);
31 }
在线演示:
浙公网安备 33010602011771号