Flash/Flex学习笔记(10):FMS 3.5之如何做视频实时直播

硬件条件:一个摄像头 + 一台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);

 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值