七、NetConnection對(duì)象 NetStream對(duì)象 等 綜合
首先假設(shè)你已經(jīng)默認(rèn)安裝了Flash Communication Server,那么在硬盤(pán)上應(yīng)該是這樣的
下面這幅圖向展示了一個(gè)大概的server工作機(jī)制
由于客戶(hù)端代碼的NetConnection對(duì)象和NetStream對(duì)象不好單獨(dú)講,這里給出了一個(gè)基于遠(yuǎn)程應(yīng)用的例子,用來(lái)給有攝像頭、麥克風(fēng)的用戶(hù)錄像,并且錄像完后可以回放。為了開(kāi)發(fā)快速,使用了一些UI組件。
下面是源文件,大家可參考 - = 源文件 = -
下面是主要的代碼和解釋?zhuān)?BR>stop(); //設(shè)置按鈕的外觀顏色 Record_btn.setStyleProperty("face", 0xf4f4f4); Remove_btn.setStyleProperty("face", 0xf4f4f4); Play_btn.setStyleProperty("face", 0xf4f4f4); // 建立新的聯(lián)接對(duì)象 client_nc = new NetConnection(); //NetConnection.onStatus(para)用來(lái)監(jiān)測(cè)server返回的信息 //當(dāng)server返回的信息時(shí),此處理器被觸發(fā) //參數(shù)是一個(gè)包含著返回信息的對(duì)象,包含著兩個(gè)固定變量level和code,該參數(shù)名稱(chēng)可隨便命名 client_nc.onStatus = function(info) { // 利用trace功能將server返回的信息可視化 trace("Level: "+info.level+newline+"Code: "+info.code); }; // 連接到server上,建立rtmp連接 //下面寫(xiě)的是相對(duì)地址,原因是我的web server和flash communication server在一臺(tái)機(jī)器上 //如果你的web server和flash communication server不在一臺(tái)機(jī)器上,只要滿(mǎn)足兩臺(tái)機(jī)器的ip在一個(gè)域 //你就可以同樣成功建立連接,可以寫(xiě)成client_nc.connect("rtmp:/192.168.0.1/record_video"); //record_video是文件夾的名字,該文件夾必須事先存在 //假設(shè)你是按照默認(rèn)安裝的communication server,那么record_video文件夾就應(yīng)該放在 //C:\Program Files\Macromedia\Flash Communication Server MX\flashcom\applications目錄下面 client_nc.connect("rtmp:/record_video"); // 使用SharedObject.getRemote方法,創(chuàng)建遠(yuǎn)程SharedObject //"myvideo"是SharedObject文件名稱(chēng),對(duì)應(yīng)在server硬盤(pán)上的文件是myvideo.fso // client_nc.uri是一個(gè)必要的參數(shù),指向當(dāng)前rtmp的連接 // 第三個(gè)是可選參數(shù),true代表將myvideo.fso寫(xiě)入硬盤(pán),false、null或者省略代表不寫(xiě)入,只作臨時(shí)存在 rec_so = SharedObject.getRemote("myvideo", client_nc.uri, true); //sharedobject.onSync(para)用來(lái)動(dòng)態(tài)監(jiān)測(cè)sharedobject的變化情況 //每當(dāng)sharedobject發(fā)生變化時(shí),此處理器被觸發(fā) //參數(shù)是一個(gè)數(shù)組,記錄sharedobject.data中發(fā)生變化的內(nèi)容,該參數(shù)名稱(chēng)可隨便命名 //該數(shù)組的每個(gè)成員都是一個(gè)對(duì)象,對(duì)象又有兩個(gè)成員code和name //name代表的是發(fā)生變化的sharedobject.data里面的發(fā)生變化的內(nèi)容 //code代表的是這個(gè)內(nèi)容發(fā)生了什么變化,是系統(tǒng)返回信息 rec_so.onSync = function(list) { //用for循環(huán)察看list中的內(nèi)容 for (var i in list) { trace("code: "+list[i].code+newline+"name: "+list[i].name); } //每次sharedobject.onSync(para)觸發(fā)的時(shí)候 //先刪除列表中的所有內(nèi)容 _root.Play_list.removeAll(); //用for循環(huán)讀取rec_so.data里面的內(nèi)容 //再往list中添加條目,達(dá)到刷新列表的作用 for (var i in _root.rec_so.data) { _root.Play_list.addItem(i); } }; // 將sharedobject功能連接到server上 rec_so.connect(client_nc); //****************************************************************** //****************************************************************** // 設(shè)置錄像功能 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..."; // 錄音的時(shí)候,停止當(dāng)前所有正在播放的條目 if (Play_btn.getLabel() == "Stop") { doPlay(); } // 錄音狀態(tài)下,禁用“播放”和“刪除”按鈕 Play_btn.setEnabled(false); Remove_btn.setEnabled(false); Play_list._visible = false; //************************************ // 在client_nc連接上,創(chuàng)建NetStream對(duì)象 out_ns = new NetStream(client_nc); // 通過(guò)NetStream.attachVideo方法獲得攝像頭的圖像 out_ns.attachVideo(this.cam); // 通過(guò)NetStream.attachAudio方法獲得麥克風(fēng)的聲音 out_ns.attachAudio(this.mic); //mybox是放置在舞臺(tái)上的Video對(duì)象 mybox.attachVideo(this.cam); // 通過(guò)NetStream.publish(p1,p2)方法向服務(wù)器發(fā)布你的視頻和音頻流 //參數(shù)p1代表你發(fā)布的流媒體文件的名稱(chēng),流媒體文件是flv格式的 //參數(shù)p2可選,有"record"、"live"、"append"可選值,分別表 //示:記錄(寫(xiě)在server硬盤(pán)上)、現(xiàn)場(chǎng)(不寫(xiě)在硬盤(pán)上)、續(xù)寫(xiě) out_ns.publish(ListItem.text, "record"); // 向SharedObject.data寫(xiě)入錄像的名稱(chēng),將會(huì)用來(lái)作為list的條目信息 _root.rec_so.data[ListItem.text] = ListItem.text; // 錄音的時(shí)候,將錄音按鈕上面的標(biāo)簽由"Record"變成"Stop" Record_btn.setLabel("Stop"); } else if (Record_btn.getLabel() == "Stop") { // 通過(guò)NetStream.close方法關(guān)閉流,停止錄音 out_ns.close(); //停止在Video對(duì)象里面播放攝像頭的圖像 mybox.attachVideo(null); //清除Video內(nèi)容 mybox.clear(); Play_list._visible = true; // 停止錄音后,用戶(hù)可以使用“播放”按鈕 Play_btn.setEnabled(true); Remove_btn.setEnabled(true); // 停止錄音后,將錄音按鈕上面的標(biāo)簽由"Stop"變成"Record" Record_btn.setLabel("Record"); // 重置“標(biāo)題”和“狀態(tài)” 本文信息 ListItem.text = ""; Status_msg.text = "..."; } } //*************************************************************** //*************************************************************** // 設(shè)置播放功能 function doPlay() { if (Play_btn.getLabel() == "Play") { Status_msg.text = "Playing..."; Play_btn.setLabel("Stop"); //局部變量playFileName用來(lái)儲(chǔ)存選中的list的標(biāo)簽label名稱(chēng) //標(biāo)簽label的名稱(chēng)就是錄像文件的名稱(chēng) var playFileName = Play_list.getSelectedItem().label; //創(chuàng)建新的NetStream流對(duì)象,將會(huì)用來(lái)播放留言信息 in_ns = new NetStream(client_nc); //通過(guò)NetStream.play方法播放server上的flv文件 in_ns.play(playFileName); Play_list._visible = false; //通過(guò)NetStream.onStatus(para)處理器動(dòng)態(tài)檢測(cè)server有關(guān)stream的返回信息 //參數(shù)para是一個(gè)對(duì)象,包含著兩個(gè)固定變量level和code,該參數(shù)名稱(chēng)可隨便命名 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對(duì)象mybox作為視頻流的播放載體,使媒體流可視化 mybox.attachVideo(in_ns); Record_btn.setEnabled(false); Remove_btn.setEnabled(false); } else if (Play_btn.getLabel() == "Stop") { //停止播放錄音,重置“狀態(tài)”文本 Status_msg.text = "..."; // 關(guān)閉流通道 in_ns.close(); //重置stream聯(lián)接狀態(tài) in_ns.onStatus = null; mybox.attachVideo(null); //清除Video內(nèi)容 mybox.clear(); Play_btn.setLabel("Play"); Record_btn.setEnabled(true); Remove_btn.setEnabled(true); Play_list._visible = true; } } //************************************************************ //************************************************************ //設(shè)置刪除功能 function doRemove() { //設(shè)置局部變量,用來(lái)儲(chǔ)存被選擇的list標(biāo)簽(Index) var selectedItem = Play_list.getSelectedIndex(); //刪除SharedObject中相對(duì)應(yīng)的項(xiàng)目 delete _root.rec_so.data[Play_list.getSelectedItem().label]; //在硬盤(pán)上重寫(xiě)SO rec_so.flush(); //在list中刪除選中的條目 Play_list.removeItemAt(selectedItem); }
錄像完成了,你能在硬盤(pán)上找到flv文件和相應(yīng)的fso文件,列如,我錄了一段錄像叫做aa
NetConnection對(duì)象: 方法:NetConnection.call,NetConnection.close,NetConnection.connect 處理器:NetConnection.onStatus
NetStream對(duì)象: 方法: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
客戶(hù)端的代碼說(shuō)完了,說(shuō)的很粗糙,因?yàn)樽约航衲旯ぷ骱苊,可能以后發(fā)彪拙文爛稿的速度會(huì)很慢。 有興趣的朋友還是安裝一個(gè)試用的Communication Server玩玩,自己看看英文的幫助文件,里面有不少例子。 服務(wù)端的代碼介紹,偶盡量抽時(shí)間給大家介紹,可能會(huì)很慢。 http://www.macromedia.com 可以下載試用版。
出處:藍(lán)色理想
責(zé)任編輯:無(wú)意
上一頁(yè) SharedObject對(duì)象 下一頁(yè)
◎進(jìn)入論壇Flash專(zhuān)欄版塊參加討論
|