硬件条件:一个摄像头 + 一台FMS服务器即可
原理:摄像头实时采集视频源,然后推送到FMS服务器,其它客户从FMS上获取视频流。
需要做二个fla,一个用于向FMS服务端推送视频源(即发送端),一个用于从FMS服务器获取并播放视频(即接收端)
Server.fla关键代码:
var
cam:Camera;
var
vod:Video;
var
intervalId:
uint
;
var
intelvalTimes:
uint
=
0
;
var
isWorked=
false
;
var
nc:NetConnection;
var
ns:NetStream;
btnPublish.addEventListener(MouseEvent.CLICK,btnPublishClick);
lblMsg.text =
"连接好摄像头后,\n点击下面的按钮"
//摄像头有活动时,被触发
function
camActivityHandler(e:ActivityEvent) {
trace
(e);
if
(!isWorked) {
intervalId=setInterval(checkCallBack,
100
);
}
}
function
checkCallBack():
void
{
intelvalTimes+=
1
;
trace
(intelvalTimes);
if
(cam.currentFPS>
0
) {
lblMsg.text=
"摄像头工作正常!"
;
isWorked=
true
;
clearInterval(intervalId);
ns.publish(
"myCamera"
,
"live"
);
//同时处理本地播放
vod =
new
Video();
vod.attachCamera(cam);
vod.height=cam.height;
vod.width=cam.width;
vod.x =
45
;
vod.y =
15
;
addChild(vod);
}
else
{
if
(intelvalTimes>=
10
) {
//持续检测2秒,仍然无图象的话,认为"设备无法使用(占用中)"
lblMsg.text=
"设备无法使用(有可能被占用)"
;
clearInterval(intervalId);
}
}
}
//用户选择"同意"或"不允许"使用摄像头时触发
function
statusHandler(e:StatusEvent) {
trace
(e);
if
(e.code==
"Camera.Muted"
) {
lblMsg.text=
"您不允许使用摄像头!"
;
}
else
if
(e.code ==
"Camera.Unmuted"
) {
lblMsg.text=
"摄像头视频获取中..."
;
}
}
//推送按钮点击事件
function
btnPublishClick(e:MouseEvent) {
nc =
new
NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);
nc.connect(
"rtmp://fms服务器ip地址/camlive"
);
}
//连接状态处理代码
function
NetStatusHandler(event:NetStatusEvent):
void
{
trace
(event.info.code);
if
(event.info.code==
"NetConnection.Connect.Success"
) {
cam=Camera.getCamera();
if
(cam==
null
) {
this
.lblMsg.text=
"未安装摄像头!"
;
return
;
}
cam.addEventListener(StatusEvent.STATUS, statusHandler);
cam.addEventListener(ActivityEvent.ACTIVITY,camActivityHandler);
ns=
new
NetStream(nc);
ns.attachCamera(cam);
}
}
Client.fla关键代码:
var
nc:NetConnection;
var
ns:NetStream;
var
vod:Video;
btnReceive.addEventListener(MouseEvent.CLICK,
function
(){
nc =
new
NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);
nc.connect(
"rtmp://fms服务器ip地址/camlive"
);
})
//连接状态处理代码
function
NetStatusHandler(event:NetStatusEvent):
void
{
trace
(event.info.code);
if
(event.info.code==
"NetConnection.Connect.Success"
) {
lblMsg.text =
"正在获取视频..."
ns=
new
NetStream(nc);
ns.addEventListener(NetStatusEvent.NET_STATUS,nsNetStatusHandler);
ns.play(
"myCamera"
);
vod =
new
Video();
vod.x=
45
;
vod.y=
15
;
vod.height=
120
;
vod.width=
160
;
vod.attachNetStream(ns);
addChild(vod);
}
}
function
nsNetStatusHandler(e:NetStatusEvent){
trace
(e.info.code);
}