一、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("开始运动");
}
}
再来看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);
注意是在两个独立的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的支持。
下面是一个仅仅基于本地的例子,我给它起了一个名字叫做“记事本”,你可以写东西在上面,别的电脑上看不见你写的。
这个例子里面用到了一些组件,请大家不用深究,只是为了制作的快捷,自己做的按钮也能达到一样的作用。
我简单说明一下本地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玩玩,自己看看英文的帮助文件,里面有不少例子。
服务端的代码介绍,偶尽量抽时间给大家介绍,可能会很慢。
http://www.macromedia.com 可以下载试用版。
使用环境: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("开始运动");
}
}
再来看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);
注意是在两个独立的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的支持。
下面是一个仅仅基于本地的例子,我给它起了一个名字叫做“记事本”,你可以写东西在上面,别的电脑上看不见你写的。
这个例子里面用到了一些组件,请大家不用深究,只是为了制作的快捷,自己做的按钮也能达到一样的作用。
我简单说明一下本地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玩玩,自己看看英文的帮助文件,里面有不少例子。
服务端的代码介绍,偶尽量抽时间给大家介绍,可能会很慢。
http://www.macromedia.com 可以下载试用版。
文章来源:http://www.blueidea.com/tech/multimedia/2003/392.asp