Flash Com Actionscript 介紹

發布時間:2007年03月15日      浏覽次數:3574 次
一(yī)、Camera 對象
使用環境:Flash Player 6,本地使用或者Flash Communication Server MX環境下(xià)。
先來做一(yī)個小(xiǎo)的實驗,請有網絡攝像頭的朋友做好準備。
打開(kāi)Flash MX,新建一(yī)個movie。選中(zhōng)菜單Window>Library,調出Library面闆。在Library面闆右上角的pop-up菜單上選中(zhōng)New Video選項,
在Library裏面将會出現一(yī)個Video對象的圖标(也是Communication的一(yī)個新對象)。
将這個東東拖進主場景,在屬性面闆上給它起一(yī)個名字myBox。選中(zhōng)菜單Window>Actions,調出,actionscipt編輯面闆,選中(zhōng)當前的幀,寫下(xià)如下(xià)的代碼:
//抓取當前默認的攝像頭圖像
cam = Camera.get();
//把圖像在flash裏面播放(fàng)出來
myBox.attachVideo(cam);
運行一(yī)下(xià),會首先彈出一(yī)個安全性提示對話(huà)框,詢問本地是否允許使用攝像頭。
确定以後,你就會看見攝像頭采集的圖像就能夠在flash裏面播放(fàng)了。是不是巨簡單,這就是MM公司的宗旨:不求麻煩,但求簡單。嘿嘿,這是我(wǒ)(wǒ)加的台詞。
當然,Camera對象和Video對象的出現主要是爲了在網上運用,提供了針對Camera網絡設置的一(yī)系列屬性、方法和處理器。
方法: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。
這裏隻是提供一(yī)個介紹,有興趣的朋友可以去(qù)MM的網站www.macromedia.com找資(zī)料看的。
反正有興趣的一(yī)定會去(qù)看,沒有興趣的翻譯出來也不會看。
************************************************************
有的朋友沒能看見彈出的安全性提示面闆,可以這樣做。
在電影上點擊右鍵“設置”(setting...),在彈出的面闆上面選擇第一(yī)個标簽項,去(qù)掉“記住”(remember)選項,再運行一(yī)下(xià)就行了。
---------------------如果還沒有出現------------------
看到最後一(yī)個标簽面闆,camera面闆,隻有當這裏檢測到并出現了下(xià)拉菜單的時候,
運行上面的代碼才能彈出上面的第三幅圖所表示的安全性提示面闆。
二、LocalConnection 對象
使用環境:Flash Player 6
Flash MX的LocalConnection對象的出現可以幫助你實現以前FSCommand或者JavaScript. LocalConnection對象的功能。
下(xià)面有兩個獨立的movie,一(yī)個叫a.swf,一(yī)個b.swf。
先看a.swf,裏面隻有一(yī)個Flash MX組件PushButton,在屬性面闆上面命名爲myButton,在Parameters面闆中(zhōng)的Click Handler填寫一(yī)個函數名oMove。在a.swf的當前幀上寫上如下(xià)的代碼:
//建立一(yī)個本地連接對象
sendingLC = new LocalConnection();
//設置myButton的标簽
myButton.setLabel("開(kāi)始運動");
//定義myButton所要執行的函數doMove
function doMove() {
if (myButton.getLabel() == "開(kāi)始運動") {
//在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("開(kāi)始運動");
}
}
再來看b.swf,裏面有26桢的motion動畫,在第一(yī)幀上寫上如下(xià)的代碼:
stop();
// 創建一(yī)個連接
receivingLC = new LocalConnection();
//在連接對象上面附上一(yī)個函數birdMove,用于播放(fàng)動畫
receivingLC.birdMove = function() {
gotoAndPlay(2);
};
//附上一(yī)個函數birdStop,用于使動畫停止
receivingLC.birdStop = function() {
gotoAndStop(2);
};
//定義一(yī)個連接名稱lc_name
//可以理解成爲一(yī)個本地聯接的通道名稱或者接口
//這是必須的步驟
receivingLC.connect("lc_name");
在b.swf的最後一(yī)幀上面寫上代碼:
gotoAndPlay(2);
注意是在兩個獨立的swf文件之間控制,是不是很有意思。當然你一(yī)定可以想出更好的應用的,趕快自己試試啦。
當然LocalConnection還有其它的細節。
方法:LocalConnection.close,LocalConnection.connect,LocalConnection.domain,LocalConnection.send。
處理器:LocalConnection.allowDomain,LocalConnection.onStatus。
這裏隻是提供一(yī)個介紹,有興趣的朋友可以去(qù)MM的網站www.macromedia.com找資(zī)料看的。
反正有興趣的一(yī)定會去(qù)看,沒有興趣的翻譯出來也不會看。
三、Microphone 對象
使用環境:Flash Player 6,本地使用或者Flash Communication Server MX環境下(xià)。
道具準備:一(yī)隻能正常使用的,已經接到你的電腦上面的麥克風,一(yī)兩塊兒能夠發出聲音的音響。
新建一(yī)個movie,在場景下(xià)面什麽都不用放(fàng)置。在當前幀上面加上如下(xià)的代碼:
//抓取麥克風,采集聲音
mic = Microphone.get();
//将麥克風的聲音在場景下(xià)播放(fàng)
//放(fàng)在一(yī)個mc裏面也行
this.attachAudio(mic);
運行一(yī)下(xià),同樣的會彈出一(yī)個安全提示面闆,和Camera的情況一(yī)樣。
下(xià)一(yī)步,把音響盡量的開(kāi)大(dà),然後對着麥克風唱(chàng)歌,我(wǒ)(wǒ)想你的鄰居會有反應的。是不是覺得這個東西水?不水的!Microphone對象的出現就是爲了發展網絡聲音對話(huà),語音郵件之類的東東,我(wǒ)(wǒ)隻是舉一(yī)個本地應用的例子而已。當然,具體(tǐ)怎麽進行網絡通信,要麽等我(wǒ)(wǒ)慢(màn)慢(màn)道來,要不您先啃啃英文解解饞。還有就是Microphone也可以和Camera對象一(yī)同使用。
在運行的swf文件上面點擊右鍵,選中(zhōng)“設置”,選擇第三個麥克風标簽面闆:
自己研究一(yī)下(xià)先。
當然Microphone還用自己的一(yī)些屬性、方法和處理器:
方法: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。
這裏隻是提供一(yī)個介紹,有興趣的朋友可以去(qù)MM的網站www.macromedia.com找資(zī)料看的。
反正有興趣的一(yī)定會去(qù)看,沒有興趣的翻譯出來也不會看。
四、MovieClip對象
在前面關于Microphone 對象介紹的例子裏面有這樣的寫法:
this.attachAudio(mic);
老閃們一(yī)看就納悶,偶~怎麽不記得有這樣地寫法,也就有個this.attachMovie什麽的。
好啦,我(wǒ)(wǒ)說明一(yī)下(xià),在Communication Server Actionscript裏面也有這麽一(yī)個MovieClip對象,可憐這個對象隻有一(yī)個方法就是MovieClip.attachAudio了。
這個東東的出現也就是爲了配合Microphone對象和NetStream對象的使用了(NetStream以後會說到)。
舉例就不用了,看看Microphone 對象的介紹就行了,雖然隻是本地應用,網絡應用以後會讨論的。
這裏隻是提供一(yī)個介紹,有興趣的朋友可以去(qù)MM的網站www.macromedia.com找資(zī)料看的。
五、Video 對象
Video對象的内容不多,請參看Camera對象的介紹。
Video對象要從library面闆裏面調出來,見下(xià)圖:
從library裏面拖出來放(fàng)在場景下(xià)就是這個樣子:
他的作用就是配合Camera對象和NetStream對象的使用。
當然,他也有自己的方法和屬性:
方法:Video.attachVideo,Video.clear
屬性:Video.deblocking,Video.height,Video.smoothing,Video.width。
這裏隻是提供一(yī)個介紹,有興趣的朋友可以去(qù)MM的網站www.macromedia.com找資(zī)料看的。這裏隻是提供一(yī)個介紹,有興趣的朋友可以去(qù)MM的網站www.macromedia.com找資(zī)料看的。
六、SharedObject對象
使用環境:Flash Player 6,本地使用或者Flash Communication Server MX環境下(xià)。
Shared objects 是非常有用的一(yī)個對象。通過它,我(wǒ)(wǒ)們可以實現在多個用戶、影片之間的數據共享,并且可以存儲數據到本地或者遠程的server上面。對于本地的Shared object功能,和 "cookies"很相似。遠程的Shared object功能實現了實時的數據傳遞和存儲。考慮到很多朋友還沒有安裝communication server,所以先讨論的是基于本地的應用舉例,不需要sever的支持。
下(xià)面是一(yī)個僅僅基于本地的例子,我(wǒ)(wǒ)給它起了一(yī)個名字叫做“記事本”,你可以寫東西在上面,别的電腦上看不見你寫的。
這個例子裏面用到了一(yī)些組件,請大(dà)家不用深究,隻是爲了制作的快捷,自己做的按鈕也能達到一(yī)樣的作用。
我(wǒ)(wǒ)簡單說明一(yī)下(xià)本地Shared object功能的操作步驟:
//首先要建立一(yī)個連接到本地的Shared object對象
//使用getLocal方法進行本地連接
//filename是存在本地的文件名,可以自己來定
local_so = SharedObject.getLocal("filename");
//對象SharedObject提供了data 屬性
//專門用來存儲數據的一(yī)個屬性
//下(xià)一(yī)句代碼是往data屬性裏面寫數據的過程
//也就是往本地硬盤上寫一(yī)個值對
local_so.data.myName = "vista";
//也可以寫一(yī)個對象,等等
local_so.data.myObject = new Object();
//當你讀去(qù)local_so.data裏面的數據的時候
//可以直接讀去(qù)
myTXT.text = local_so.data.myName ;
//也可以使用一(yī)個for in 循環來作
for(i in local_so.data){
trace( local_so.data[i] );
}
注意,這樣的寫法是錯誤的:local_so.data = "公元2003";
默認的時候,在電影上點擊鼠标右鍵,調出“設置”面闆,第二個選項卡:
假如允許本地存儲最大(dà)1k的數據,當要寫10k的時候,player會做出這樣的提示:
你可以在第二個選項卡裏面進行調節。
下(xià)面是“記事本”的源代碼,高手可以不看了,時間倉促,沒有過多考慮邏輯什麽的,僅僅爲了實現效果,謝謝給于指正。
源文件
當然,SharedObject有自己的一(yī)些個方法、屬性和處理器。
方法:SharedObject.close,SharedObject.connect,SharedObject.flush,SharedObject.getLocal,SharedObject.getRemote,SharedObject.getSize,SharedObject.send,SharedObject.setFps。
屬性:SharedObject.data。
處理器:SharedObject.onStatus,SharedObject.onSync。
這裏隻是提供一(yī)個介紹,有興趣的朋友可以去(qù)MM的網站
www.macromedia.com 找資(zī)料看的。
七、NetConnection對象 NetStream對象 等 綜合
首先假設你已經默認安裝了Flash Communication Server,那麽在硬盤上應該是這樣的
下(xià)面這幅圖向展示了一(yī)個大(dà)概的server工(gōng)作機制
由于客戶端代碼的NetConnection對象和NetStream對象不好單獨講,這裏給出了一(yī)個基于遠程應用的例子,用來給有攝像頭、麥克風的用戶錄像,并且錄像完後可以回放(fàng)。爲了開(kāi)發快速,使用了一(yī)些UI組件。
下(xià)面是源文件,大(dà)家可參考
- = 源文件 = -
下(xià)面是主要的代碼和解釋:
stop();
//設置按鈕的外(wài)觀顔色
Record_btn.setStyleProperty("face", 0xf4f4f4);
Remove_btn.setStyleProperty("face", 0xf4f4f4);
Play_btn.setStyleProperty("face", 0xf4f4f4);
// 建立新的聯接對象
client_nc = new NetConnection();
//NetConnection.onStatus(para)用來監測server返回的信息
//當server返回的信息時,此處理器被觸發
//參數是一(yī)個包含着返回信息的對象,包含着兩個固定變量level和code,該參數名稱可随便命名
client_nc.onStatus = function(info) {
// 利用trace功能将server返回的信息可視化
trace("Level: "+info.level+newline+"Code: "+info.code);
};
// 連接到server上,建立rtmp連接
//下(xià)面寫的是相對地址,原因是我(wǒ)(wǒ)的web server和flash communication server在一(yī)台機器上
//如果你的web server和flash communication server不在一(yī)台機器上,隻要滿足兩台機器的ip在一(yī)個域
//你就可以同樣成功建立連接,可以寫成client_nc.connect("rtmp:/192.168.0.1/record_video");
//record_video是文件夾的名字,該文件夾必須事先存在
//假設你是按照默認安裝的communication server,那麽record_video文件夾就應該放(fàng)在
//C:\Program Files\Macromedia\Flash Communication Server MX\flashcom\applications目錄下(xià)面
client_nc.connect("rtmp:/record_video");
// 使用SharedObject.getRemote方法,創建遠程SharedObject
//"myvideo"是SharedObject文件名稱,對應在server硬盤上的文件是myvideo.fso
// client_nc.uri是一(yī)個必要的參數,指向當前rtmp的連接
// 第三個是可選參數,true代表将myvideo.fso寫入硬盤,false、null或者省略代表不寫入,隻作臨時存在
rec_so = SharedObject.getRemote("myvideo", client_nc.uri, true);
//sharedobject.onSync(para)用來動态監測sharedobject的變化情況
//每當sharedobject發生(shēng)變化時,此處理器被觸發
//參數是一(yī)個數組,記錄sharedobject.data中(zhōng)發生(shēng)變化的内容,該參數名稱可随便命名
//該數組的每個成員(yuán)都是一(yī)個對象,對象又(yòu)有兩個成員(yuán)code和name
//name代表的是發生(shēng)變化的sharedobject.data裏面的發生(shēng)變化的内容
//code代表的是這個内容發生(shēng)了什麽變化,是系統返回信息
rec_so.onSync = function(list) {
//用for循環察看list中(zhōng)的内容
for (var i in list) {
trace("code: "+list[i].code+newline+"name: "+list[i].name);
}
//每次sharedobject.onSync(para)觸發的時候
//先删除列表中(zhōng)的所有内容
_root.Play_list.removeAll();
//用for循環讀取rec_so.data裏面的内容
//再往list中(zhōng)添加條目,達到刷新列表的作用
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...";
// 錄音的時候,停止當前所有正在播放(fàng)的條目
if (Play_btn.getLabel() == "Stop") {
doPlay();
}
// 錄音狀态下(xià),禁用“播放(fàng)”和“删除”按鈕
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是放(fàng)置在舞台上的Video對象
mybox.attachVideo(this.cam);
// 通過NetStream.publish(p1,p2)方法向服務器發布你的視頻(pín)和音頻(pín)流
//參數p1代表你發布的流媒體(tǐ)文件的名稱,流媒體(tǐ)文件是flv格式的
//參數p2可選,有"record"、"live"、"append"可選值,分(fēn)别表
//示:記錄(寫在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對象裏面播放(fàng)攝像頭的圖像
mybox.attachVideo(null);
//清除Video内容
mybox.clear();
Play_list._visible = true;
// 停止錄音後,用戶可以使用“播放(fàng)”按鈕
Play_btn.setEnabled(true);
Remove_btn.setEnabled(true);
// 停止錄音後,将錄音按鈕上面的标簽由"Stop"變成"Record"
Record_btn.setLabel("Record");
// 重置“标題”和“狀态” 本文信息
ListItem.text = "";
Status_msg.text = "...";
}
}
//***************************************************************
//***************************************************************
// 設置播放(fàng)功能
function doPlay() {
if (Play_btn.getLabel() == "Play") {
Status_msg.text = "Playing...";
Play_btn.setLabel("Stop");
//局部變量playFileName用來儲存選中(zhōng)的list的标簽label名稱
//标簽label的名稱就是錄像文件的名稱
var playFileName = Play_list.getSelectedItem().label;
//創建新的NetStream流對象,将會用來播放(fàng)留言信息
in_ns = new NetStream(client_nc);
//通過NetStream.play方法播放(fàng)server上的flv文件
in_ns.play(playFileName);
Play_list._visible = false;
//通過NetStream.onStatus(para)處理器動态檢測server有關stream的返回信息
//參數para是一(yī)個對象,包含着兩個固定變量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作爲視頻(pín)流的播放(fàng)載體(tǐ),使媒體(tǐ)流可視化
mybox.attachVideo(in_ns);
Record_btn.setEnabled(false);
Remove_btn.setEnabled(false);
} else if (Play_btn.getLabel() == "Stop") {
//停止播放(fàng)錄音,重置“狀态”文本
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中(zhōng)相對應的項目
delete _root.rec_so.data[Play_list.getSelectedItem().label];
//在硬盤上重寫SO
rec_so.flush();
//在list中(zhōng)删除選中(zhōng)的條目
Play_list.removeItemAt(selectedItem);
}
錄像完成了,你能在硬盤上找到flv文件和相應的fso文件,列如,我(wǒ)(wǒ)錄了一(yī)段錄像叫做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
客戶端的代碼說完了,說的很粗糙,因爲自己今年工(gōng)作很忙,可能以後發彪拙文爛稿的速度會很慢(màn)。
有興趣的朋友還是安裝一(yī)個試用的Communication Server玩玩,自己看看英文的幫助文件,裏面有不少例子。
服務端的代碼介紹,偶盡量抽時間給大(dà)家介紹,可能會很慢(màn)。
http://www.macromedia.com 可以下(xià)載試用版。
文章來源:http://www.blueidea.com/tech/multimedia/2003/392.asp
免責聲明:本站相關技術文章信息部分(fēn)來自網絡,目的主要是傳播更多信息,如果您認爲本站的某些信息侵犯了您的版權,請與我(wǒ)(wǒ)們聯系,我(wǒ)(wǒ)們會即時妥善的處理,謝謝合作!