繁体中文
设为首页
加入收藏
当前位置:网站制作首页 >> Flash教程 >> FlashCom Actionscript介绍

FlashCom Actionscript介绍

2007-11-15 08:00:00  作者:  来源:互联网  浏览次数:0  文字大小:【】【】【
简介:-------------------------------------------- |------------Camera 对象------------| -------------------------------------------- 使用环境:Flash Player 6,本地使用或者Flash Communication Server MX环...
关键字:Actionscript FlashCom

--------------------------------------------

|------------Camera 对象------------|

--------------------------------------------

使用环境:Flash Player 6,本地使用或者Flash Communication Server MX环境下。

先来做一个小的实验,请有网络摄像头的朋友做好准备。

打开Flash MX,新建一个movie。选中菜单Window>Library,调出Library面板。在Library面板右上角的pop-up菜单上选中New Video选项,

在Library里面将会出现一个Video对象的图标(也是Communication的一个新对象)。

将这个东东拖进主场景,在属性面板上给它起一个名字myBox。选中菜单Window>Actions,调出,actionscipt编辑面板,选中当前的帧,写下如下的代码:

//抓取当前默认的摄像头图像

cam = Camera.get();

//把图像在Flash里面播放出来

myBox.attachVideo(cam);

运行一下,会首先弹出一个安全性提示对话框,询问本地是否允许使用摄像头。

确定以后,你就会看见摄像头采集的图像就能够在Flash里面播放了。是不是巨简单,这就是MM公司的宗旨:不求麻烦,但求简单。嘿嘿,这是我加的台词。

当然,Camera对象和Video对象的出现主要是为了在网上运用,提供了针对Camera网络设置的一系列属性、方法和处理器。

方法:Camera.get,Camera.setKeyFrameInterval,Camera.setLoopback,Camera.setMode,Camera.setMotionLevel,Camera.setQuality;

属性:Camera.activityLevel,Camera.bandwidth,Camera.currentFps,Camera.fps,Camera.height,Camera.index,Camera.keyFrameInterval,Camera.loopback,Camera.motionLevel,Camera.motionTimeOut,Camera.muted,Camera.name,Camera.names,Camera.quality,Camera.width。

处理器:Camera.onActivity,Camera.onStatus。

这里只是提供一个介绍,有兴趣的朋友可以去MM的网站www.macromedia.com找资料看的。

反正有兴趣的一定会去看,没有兴趣的翻译出来也不会看。

************************************************************

有的朋友没能看见弹出的安全性提示面板,可以这样做。

在电影上点击右键“设置”(setting...),在弹出的面板上面选择第一个标签项,去掉“记住”(remember)选项,再运行一下就行了。

---------------------如果还没有出现------------------

看到最后一个标签面板,camera面板,只有当这里检测到并出现了下拉菜单的时候,

运行上面的代码才能弹出上面的第三幅图所表示的安全性提示面板。

--------------------------------------------------------

|------------LocalConnection 对象------------|

--------------------------------------------------------

使用环境:Flash Player 6

Flash MX的LocalConnection对象的出现可以帮助你实现以前FSCommand或者JavaScript. LocalConnection对象的功能。

下面有两个独立的movie,一个叫a.swf,一个b.swf。

先看a.swf,里面只有一个Flash MX组件PushButton,在属性面板上面命名为myButton,在Parameters面板中的Click Handler填写一个函数名oMove。在a.swf的当前帧上写上如下的代码:

//建立一个本地连接对象

sendingLC = new LocalConnection();

//设置myButton的标签

myButton.setLabel("开始运动";

//定义myButton所要执行的函数doMove

function doMove() {

if (myButton.getLabel() == "开始运动" {

//在b.swf建立的通道lc_name上面发出执行函数birdMove的命令

sendingLC.send("lc_name", "birdMove";

//改变myButton的标签

myButton.setLabel("停止运动";

} else if (myButton.getLabel() == "停止运动" {

//在b.swf建立的通道lc_name上面发出执行函数birdStop的命令

sendingLC.send("lc_name", "birdStop";

myButton.setLabel("开始运动";

}

}

[f]http://www.5dmedia.com/bbs/uploadFiles/200311223291756191.swf[/f]

再来看b.swf,里面有26桢的motion动画,在第一帧上写上如下的代码:

stop();

// 创建一个连接

receivingLC = new LocalConnection();

//在连接对象上面附上一个函数birdMove,用于播放动画

receivingLC.birdMove = function() {

gotoAndPlay(2);

};

//附上一个函数birdStop,用于使动画停止

receivingLC.birdStop = function() {

gotoAndStop(2);

};

//定义一个连接名称lc_name

//可以理解成为一个本地联接的通道名称或者接口

//这是必须的步骤

receivingLC.connect("lc_name";

在b.swf的最后一帧上面写上代码:

gotoAndPlay(2);

[f]http://www.5dmedia.com/bbs/uploadFiles/200311223295590235.swf[/f]

注意是在两个独立的swf文件之间控制,是不是很有意思。当然你一定可以想出更好的应用的,赶快自己试试啦。

当然LocalConnection还有其它的细节。

方法:LocalConnection.close,LocalConnection.connect,LocalConnection.domain,LocalConnection.send。

处理器:LocalConnection.allowDomain,LocalConnection.onStatus。

这里只是提供一个介绍,有兴趣的朋友可以去MM的网站www.macromedia.com找资料看的。

反正有兴趣的一定会去看,没有兴趣的翻译出来也不会看。

-------------------------------------------------

|------------Microphone 对象------------|

-------------------------------------------------

使用环境:Flash Player 6,本地使用或者Flash Communication Server MX环境下。

道具准备:一只能正常使用的,已经接到你的电脑上面的麦克风,一两块儿能够发出声音的音响。

新建一个movie,在场景下面什么都不用放置。在当前帧上面加上如下的代码:

//抓取麦克风,采集声音

mic = Microphone.get();

//将麦克风的声音在场景下播放

//放在一个mc里面也行

this.attachAudio(mic);

运行一下,同样的会弹出一个安全提示面板,和Camera的情况一样。

下一步,把音响尽量的开大,然后对着麦克风唱歌,我想你的邻居会有反应的。是不是觉得这个东西水?不水的!Microphone对象的出现就是为了发展网络声音对话,语音邮件之类的东东,我只是举一个本地应用的例子而已。当然,具体怎么进行网络通信,要么等我慢慢道来,要不您先啃啃英文解解馋。还有就是Microphone也可以和Camera对象一同使用。

在运行的swf文件上面点击右键,选中“设置”,选择第三个麦克风标签面板:

自己研究一下先。

当然Microphone还用自己的一些属性、方法和处理器:

方法:Microphone.get,Microphone.setGain,Microphone.setRate,Microphone.setSilenceLevel,Microphone.setUseEchoSuppression。

属性:Microphone.activityLevel,Microphone.gain,Microphone.index,Microphone.muted,Microphone.name,Microphone.names,Microphone.rate,Microphone.silenceLevel,Microphone.silenceTimeout,Microphone.useEchoSuppression。

处理器:Microphone.onActivity,Microphone.onStatus。

这里只是提供一个介绍,有兴趣的朋友可以去MM的网站www.macromedia.com找资料看的。

反正有兴趣的一定会去看,没有兴趣的翻译出来也不会看。

-------------------------------------------------------------------------

|-------------------------MovieClip对象----------------------------|

-------------------------------------------------------------------------

在前面关于Microphone 对象介绍的例子里面有这样的写法:

this.attachAudio(mic);

老闪们一看就纳闷,偶~怎么不记得有这样地写法,也就有个this.attachMovie什么的。

好啦,我说明一下,在Communication Server Actionscript里面也有这么一个MovieClip对象,可怜这个对象只有一个方法就是MovieClip.attachAudio了。

这个东东的出现也就是为了配合Microphone对象和NetStream对象的使用了(NetStream以后会说到)。

举例就不用了,看看Microphone 对象的介绍就行了,虽然只是本地应用,网络应用以后会讨论的。

这里只是提供一个介绍,有兴趣的朋友可以去MM的网站www.macromedia.com找资料看的。

------------------------------------------------------------------------

|------------------------Video 对象----------------------------|

------------------------------------------------------------------------

这篇贴子看起来像灌水,Video对象的内容不多,请参看Camera对象的介绍。

Video对象要从library面板里面调出来,见下图:

从library里面拖出来放在场景下就是这个样子:

他的作用就是配合Camera对象和NetStream对象的使用。

当然,他也有自己的方法和属性:

方法:Video.attachVideo,Video.clear

属性:Video.deblocking,Video.height,Video.smoothing,Video.width。

这里只是提供一个介绍,有兴趣的朋友可以去MM的网站www.macromedia.com找资料看的。这里只是提供一个介绍,有兴趣的朋友可以去MM的网站www.macromedia.com找资料看的。

-----------------------------------------------------------------------------------

|------------------------SharedObject对象----------------------------|

-----------------------------------------------------------------------------------

使用环境:Flash Player 6,本地使用或者Flash Communication Server MX环境下。

Shared objects 是非常有用的一个对象。通过它,我们可以实现在多个用户、影片之间的数据共享,并且可以存储数据到本地或者远程的server上面。对于本地的Shared object功能,和 "cookies"很相似。远程的Shared object功能实现了实时的数据传递和存储。考虑到很多朋友还没有安装communication server,所以先讨论的是基于本地的应用举例,不需要sever的支持。

下面是一个仅仅基于本地的例子,我给它起了一个名字叫做“记事本”,你可以写东西在上面,别的电脑上看不见你写的。

[f]http://www.5dmedia.com/bbs/uploadFiles/20031250223484039.swf[/f]

这个例子里面用到了一些组件,请大家不用深究,只是为了制作的快捷,自己做的按钮也能达到一样的作用。

我简单说明一下本地Shared object功能的操作步骤:

//首先要建立一个连接到本地的Shared object对象

//使用getLocal方法进行本地连接

//filename是存在本地的文件名,可以自己来定

local_so = SharedObject.getLocal("filename";

//对象SharedObject提供了data 属性

//专门用来存储数据的一个属性

//下一句代码是往data属性里面写数据的过程

//也就是往本地硬盘上写一个值对

local_so.data.myName = "vista";

//也可以写一个对象,等等

local_so.data.myObject = new Object();

//当你读去local_so.data里面的数据的时候

//可以直接读去

myTXT.text = local_so.data.myName ;

//也可以使用一个for in 循环来作

for(i in local_so.data){

trace( local_so.data[i] );

}

注意,这样的写法是错误的:local_so.data = "公元2003";

默认的时候,在电影上点击鼠标右键,调出“设置”面板,第二个选项卡:

假如允许本地存储最大1k的数据,当要写10k的时候,player会做出这样的提示:

你可以在第二个选项卡里面进行调节。

下面是“记事本”的源代码,高手可以不看了,时间仓促,没有过多考虑逻辑什么的,仅仅为了实现效果,谢谢给于指正。

源文件

当然,SharedObject有自己的一些个方法、属性和处理器。

方法:SharedObject.close,SharedObject.connect,SharedObject.flush,SharedObject.getLocal,SharedObject.getRemote,SharedObject.getSize,SharedObject.send,SharedObject.setFps。

属性:SharedObject.data。

处理器:SharedObject.onStatus,SharedObject.onSync。

这里只是提供一个介绍,有兴趣的朋友可以去MM的网站

www.macromedia.com 找资料看的。

--------------------------------------------------------------------------------

| NetConnection对象 NetStream对象 等 综合 |

---------------------------------------------------------------------------------

首先假设你已经默认安装了Flash Communication Server,那么在硬盘上应该是这样的

下面这幅图向展示了一个大概的server工作机制

由于客户端代码的NetConnection对象和NetStream对象不好单独讲,这里给出了一个基于远程应用的例子,用来给有摄像头、麦克风的用户录像,并且录像完后可以回放。为了开发快速,使用了一些UI组件。

下面是源文件,大家可参考

- = 源文件 = -

下面是主要的代码和解释:

stop();

//设置按钮的外观颜色

Record_btn.setStyleProperty("face", 0xf4f4f4);

Remove_btn.setStyleProperty("face", 0xf4f4f4);

Play_btn.setStyleProperty("face", 0xf4f4f4);

// 建立新的联接对象

client_nc = new NetConnection();

//NetConnection.onStatus(para)用来监测server返回的信息

//当server返回的信息时,此处理器被触发

//参数是一个包含着返回信息的对象,包含着两个固定变量level和code,该参数名称可随便命名

client_nc.onStatus = function(info) {

// 利用trace功能将server返回的信息可视化

trace("Level: "+info.level+newline+"Code: "+info.code);

};

// 连接到server上,建立rtmp连接

//下面写的是相对地址,原因是我的web server和Flash communication server在一台机器上

//如果你的web server和Flash communication server不在一台机器上,只要满足两台机器的ip在一个域

//你就可以同样成功建立连接,可以写成client_nc.connect("rtmp:/192.168.0.1/record_video";

//record_video是文件夹的名字,该文件夹必须事先存在

//假设你是按照默认安装的communication server,那么record_video文件夹就应该放在

//C:\Program Files\Macromedia\Flash Communication Server MX\Flashcom\applications目录下面

client_nc.connect("rtmp:/record_video";

// 使用SharedObject.getRemote方法,创建远程SharedObject

//"myvideo"是SharedObject文件名称,对应在server硬盘上的文件是myvideo.fso

// client_nc.uri是一个必要的参数,指向当前rtmp的连接

// 第三个是可选参数,true代表将myvideo.fso写入硬盘,false、null或者省略代表不写入,只作临时存在

rec_so = SharedObject.getRemote("myvideo", client_nc.uri, true);

//sharedobject.onSync(para)用来动态监测sharedobject的变化情况

//每当sharedobject发生变化时,此处理器被触发

//参数是一个数组,记录sharedobject.data中发生变化的内容,该参数名称可随便命名

//该数组的每个成员都是一个对象,对象又有两个成员code和name

//name代表的是发生变化的sharedobject.data里面的发生变化的内容

//code代表的是这个内容发生了什么变化,是系统返回信息

rec_so.onSync = function(list) {

//用for循环察看list中的内容

for (var i in list) {

trace("code: "+list[i].code+newline+"name: "+list[i].name);

}

//每次sharedobject.onSync(para)触发的时候

//先删除列表中的所有内容

_root.Play_list.removeAll();

//用for循环读取rec_so.data里面的内容

//再往list中添加条目,达到刷新列表的作用

for (var i in _root.rec_so.data) {

_root.Play_list.addItem(i);

}

};

// 将sharedobject功能连接到server上

rec_so.connect(client_nc);

//***************************************************************************************

//***************************************************************************************

// 设置录像功能

function doRecord() {

this.cam = Camera.get();

this.mic = Microphone.get();

if (ListItem.text == undefined || ListItem.text == "" {

Status_msg.text = "Please enter a title.";

} else if (Record_btn.getLabel() == "Record" {

Status_msg.text = "Recording...";

// 录音的时候,停止当前所有正在播放的条目

if (Play_btn.getLabel() == "Stop" {

doPlay();

}

// 录音状态下,禁用“播放”和“删除”按钮

Play_btn.setEnabled(false);

Remove_btn.setEnabled(false);

Play_list._visible = false;

//************************************

// 在client_nc连接上,创建NetStream对象

out_ns = new NetStream(client_nc);

// 通过NetStream.attachVideo方法获得摄像头的图像

out_ns.attachVideo(this.cam);

// 通过NetStream.attachAudio方法获得麦克风的声音

out_ns.attachAudio(this.mic);

//mybox是放置在舞台上的Video对象

mybox.attachVideo(this.cam);

// 通过NetStream.publish(p1,p2)方法向服务器发布你的视频和音频流

//参数p1代表你发布的流媒体文件的名称,流媒体文件是flv格式的

//参数p2可选,有"record"、"live"、"append"可选值,分别表

//示:记录(写在server硬盘上)、现场(不写在硬盘上)、续写

out_ns.publish(ListItem.text, "record";

// 向SharedObject.data写入录像的名称,将会用来作为list的条目信息

_root.rec_so.data[ListItem.text] = ListItem.text;

// 录音的时候,将录音按钮上面的标签由"Record"变成"Stop"

Record_btn.setLabel("Stop";

} else if (Record_btn.getLabel() == "Stop" {

// 通过NetStream.close方法关闭流,停止录音

out_ns.close();

//停止在Video对象里面播放摄像头的图像

mybox.attachVideo(null);

//清除Video内容

mybox.clear();

Play_list._visible = true;

// 停止录音后,用户可以使用“播放”按钮

Play_btn.setEnabled(true);

Remove_btn.setEnabled(true);

// 停止录音后,将录音按钮上面的标签由"Stop"变成"Record"

Record_btn.setLabel("Record";

// 重置“标题”和“状态” 本文信息

ListItem.text = "";

Status_msg.text = "...";

}

}

//***************************************************************************************

//***************************************************************************************

// 设置播放功能

function doPlay() {

if (Play_btn.getLabel() == "Play" {

Status_msg.text = "Playing...";

Play_btn.setLabel("Stop";

//局部变量playFileName用来储存选中的list的标签label名称

//标签label的名称就是录像文件的名称

var playFileName = Play_list.getSelectedItem().label;

//创建新的NetStream流对象,将会用来播放留言信息

in_ns = new NetStream(client_nc);

//通过NetStream.play方法播放server上的flv文件

in_ns.play(playFileName);

Play_list._visible = false;

//通过NetStream.onStatus(para)处理器动态检测server有关stream的返回信息

//参数para是一个对象,包含着两个固定变量level和code,该参数名称可随便命名

in_ns.onStatus = function(info) {

trace("Level: "+info.level+newline+"Code: "+info.code);

if (info.level == "error" || info.code == "NetStream.Play.Stop" {

Status_msg.text = "Stopped sending data...";

Play_btn.setLabel("Play";

Record_btn.setEnabled(true);

Remove_btn.setEnabled(true);

mybox.clear();

Play_list._visible = true;

}

};

//Video对象mybox作为视频流的播放载体,使媒体流可视化

mybox.attachVideo(in_ns);

Record_btn.setEnabled(false);

Remove_btn.setEnabled(false);

} else if (Play_btn.getLabel() == "Stop" {

//停止播放录音,重置“状态”文本

Status_msg.text = "...";

// 关闭流通道

in_ns.close();

//重置stream联接状态

in_ns.onStatus = null;

mybox.attachVideo(null);

//清除Video内容

mybox.clear();

Play_btn.setLabel("Play";

Record_btn.setEnabled(true);

Remove_btn.setEnabled(true);

Play_list._visible = true;

}

}

//***************************************************************************************

//***************************************************************************************

//设置删除功能

function doRemove() {

//设置局部变量,用来储存被选择的list标签(Index)

var selectedItem = Play_list.getSelectedIndex();

//删除SharedObject中相对应的项目

delete _root.rec_so.data[Play_list.getSelectedItem().label];

//在硬盘上重写SO

rec_so.flush();

//在list中删除选中的条目

Play_list.removeItemAt(selectedItem);

}

录像完成了,你能在硬盘上找到flv文件和相应的fso文件,列如,我录了一段录像叫做aa

NetConnection对象:

方法:NetConnection.call,NetConnection.close,NetConnection.connect

处理器:NetConnection.onStatus

NetStream对象:

方法:NetStream.attachAudio,NetStream.attachVideo,NetStream.close,NetStream.pause,NetStream.play,NetStream.publish,NetStream.receiveAudio,NetStream.receiveVideo,NetStream.seek,NetStream.send,NetStream.setBufferTime

属性:NetStream.bufferLength,NetStream.bufferTime,NetStream.currentFps,NetStream.time

处理器:NetStream.onStatus

客户端的代码说完了,说的很粗糙,因为自己今年工作很忙,可能以后发彪拙文烂稿的速度会很慢。

有兴趣的朋友还是安装一个试用的Communication Server玩玩,自己看看英文的帮助文件,里面有不少例子。

服务端的代码介绍,偶尽量抽时间给大家介绍,可能会很慢。

www.macromedia.com 可以下载试用版。

责任编辑:admin
相关文章