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

硬件条件:一个摄像头 + 一台FMS服务器即可

原理:摄像头实时采集视频源,然后推送到FMS服务器,其它客户从FMS上获取视频流。

需要做二个fla,一个用于向FMS服务端推送视频源(即发送端),一个用于从FMS服务器获取并播放视频(即接收端)

Server.fla关键代码:

view source

print?

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关键代码:

view source

print?

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
}

在线演示:

推送端
接收端

posted @ 2010-11-22 16:26  模西的哥哥  阅读(365)  评论(0编辑  收藏  举报