Flash/Flex学习笔记(12):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 条评论
登录 后参与评论

相关文章

来自专栏前端萌媛的成长之路

SEO

2412
来自专栏Python中文社区

Python破解简书登录极验验证码

專 欄 ❈ treelake ,Python中文社区专栏作者。 博客地址: http://www.jianshu.com/u/66f24f2c0f36 ❈...

4655
来自专栏伪君子的梦呓

用 Python 查看微信好友位置信息

0 前言 上一次是用 itchat 这个包,然后把好友的性别比例打印出来,并且弄出了饼图和柱状图,今天还是使用 itchat 这个包,不过是用来看一下微信好友...

3035
来自专栏钱塘大数据

【干货】让你用Excel做出强大漂亮的数据地图

看了大部分关于如何用excel做数据地图的回答,感觉最费劲的地方都在地图素材上,有用多边形描出来的(有点儿累),有推荐excel插件的(不喜欢依赖插件或软件包)...

1633
来自专栏前端说吧

Echarts - 树图实现四个层级

我相信很多人和我一样,制作echats图标时,都会先去demo官网找相同的或者近似的效果,然后再此基础上改进成我们想要的那个。

2312
来自专栏企鹅号快讯

使用 Python+Selenium制作Flash游戏辅助

知道 Selenium 用来测试或爬取动态内容,还真没想过用来做游戏外挂 作者:sincerefly 来源:https://blog.yasking.org/a...

7617
来自专栏极客猴

学爬虫之道

Django 已经算是入门,所以自己把学习目标转到爬虫。自己接下来会利用三个月的时间来专攻 Python 爬虫。这几天,我使用“主题阅读方法”阅读 Python...

1002
来自专栏技术换美食换不换

推荐视频:gameboy

这个视频太棒啦!!!简直是应该作为游戏入门课的一个视频!讲了任天堂时代GameBoy的内核构成和基本渲染技巧,包括且不限于:

711
来自专栏FreeBuf

极客DIY:制作一款属于自己的街机

还记得那些给人带来乐趣的街机吗?你是不是也想拥有一款属于自己的街机呢?如果你有想法,那么就请看看我们的极客大神是如何DIY属于自己的街机的吧,相信你会大呼过瘾的...

3596
来自专栏xingoo, 一个梦想做发明家的程序员

我的AI之路 —— OCR文字识别快速体验版

还记得前一阵某小盆友拿过来一个全是图片的ppt,让我把里面的文字给抠出来(我当时很震惊!!!),随后在网上随便找了个OCR的在线文档转换软件,就给转过来了——这...

4152

扫码关注云+社区