FMS2 初體驗(3) – 完結篇
核心功能都玩完後,順邊把FMS2安裝目錄逛一遍,看有沒有偷藏什麼好東東,結果有以下發現:
-lic檔:
就跟 flash remoting, flex, jrun等產品一般,FMS2是靠一紙 xxxx.lic 來記錄授權資訊,而且最妙的地方在於這個lic是純文字檔,打開就可以看到裏面的內容,包含「到期日」之類的資訊;我試者將它移到其它目錄再重開 FMS2 果然就變回 dev版(1MB/5 connections),所以由此幾乎可以判斷將來 FMS2的賣法應該也是分等級,其中 dev是免費開發版,而「不限頻寬/5000連線數」的則是最貴版(十五萬台幣左右),另外應該還可以再堆疊license上去;比較好奇的是在這中間是否還會有中階產品出現?例如五萬元(約略coldfusion的價位)給個 10Mb/1000連線數之類的。
如果這個價位的產品能出現的話,對mm與業主來說都是利多,畢竟台灣想做 Flashcom 應用的業主都以中小企業為主,其中十個有八個是想做影音聊天電話交友之類的服務(我們平均每個月會接到兩三個詢問個案),而這些業主再強也不可能弄到超過10Mb的線路,所以五萬元會是一個非常殺的搶手貨啊~
-神祕的 G711.dll 與 Screenshare.dll:
這兩個dll都大有來頭,其中 G711主要是用於 VoIP(ip telephony),它是採用 8 bit PCM壓縮原理的codec,詳情請看wiki解釋。這個DLL原本是用於 Breeze 的 telephony support, 例如上次MM財報大會時,無法透過browser聽到聲音的用戶就可以直接打電話進去聽演講或發問,這就是 breeze telephony gateway 加上 G711的功用。
而Screenshar.dll則更是讓人眼睛一亮,心想是不是mm終於良心發現願意放棄商業獨佔奔向開放源碼的光明境界因此決定提供眾人期待以久的Screen Sharing功能一解多年的憾恨但在看完這麼長一句沒有逗號分隔可喘氣的句子後我仍然只能很遺憾的告訴你這一切都是落花有意流水無情想太多啦~
要瞭解這個問題必需對 Flash Player與 Screen sharing這兩件事有根本的認識,首先,要能做到 screen sharing就必需要有程式負責把畫面抓下來,這部份很簡單,用類似下面的程式碼即可(用 C 寫成):
-
pixelData.width = gdk_pixbuf_get_width (pixbuf);
-
pixelData.height = gdk_pixbuf_get_height (pixbuf);
-
pixelData.data = gdk_pixbuf_get_pixels (pixbuf);
-
pixelData.rowOrder = TOPDOWN;
-
pixelData.n_channels = n_channels;
-
pixelData.rowPadding = rowstride - pixelData.width * n_channels;
-
FlvStream_writeVideoTag(flv, timeStamp, 0, &pixelData);
-
//(source: libflv project - Copyright 2005 Klaus Rechert)
但重點是程式(也就是player)本身必需有能力去做這件事,例如內含必需的library,可是這樣做的話無可避免會增加 player本身的size,而保持flash player 苗條的身段一直是mm最高優先,因此當然不會內建在flash player裏面;這也是為何 breeze 會需要額外下載 breezeAddIn.exe,這支 exe就包含了上述 screen capture所需的一切功能。
其次,raw data抓下來後,由於資料量非常大,因此勢必要先壓過才能傳出去,以上面的例子,它是直接壓成 flv 然後寫入 filesystem,而 breezeAddIn 想當然爾就是透過內建的codec 壓縮成 flv傳回 breeze內建的flashcom server,因而做到了 screen sharing。
從這兩段描述就可以瞭解,一支能 capture + compress + streaming 的程式是不可或缺的,而目前Flash Player 8只具備了後兩項,自然是無法抓畫面啊~
那FMS2裏面這個 Screenshar.dll 到底是做什麼用的呢?個人推測是用來接收 client端傳回的 screen capture data,因為FP7裏除了有 Sorenson spark codec外,還有一個比較少人知道的 Screen Video Codec,猜測合理的作業流程是screen video codec負責壓縮screen sharing的raw data然後傳回 breeze/flashcom(請注意 breeze裏面的flashcom是特別版,不是一般的flashcom),此時 Screenshare.dll就負責接收這段 stream,後續有可能在server端即時 transcoding成 sorenson spark flv再廣播出去以節省頻寬。
所以 FMS2 裏面放個 Screenshar.dll 恐怕只是為了給 breeze 5測試用,將來正式版很有可能就會拿掉。
□ screensharing using breezeaddin
既然講到 breezeaddin,不如就順便聊聊這件事吧。
去年初玩家們籍由分析 flex 的 base class 發現在 flash player 裏有內建某種程式下載機制,當時大家用下列語法就可以順便安裝 central plugin (主要提供file upload) 與 breezeAddIn(用途顧名思意不用再解釋吧?)
-
var m = new System.Product("central");
-
m.download();
一旦下載完成後,就可以用下列語法來抓畫面:
-
var tmp = "screen";
-
var c = Camera.get(tmp);
然後將寫好的 swf 拖放到 breezeAddIn上就可順利執行並做到補捉畫面,這支程式甚至還可以讓你選擇要抓那個開啟中的應用程式來廣播。
這一切聽起來都很順利,你知道了如何下載、安裝俱備 screen capture能力的breezeAddIn,也知道用什麼語法去觸發補捉畫面,沒有理由不善用這功能來寫許多偉大的曠世巨作不是嗎?
問題只有一個,flashcom不吃這套。
經過去年初一長串的測試後終於証實,flashcom裏面有某種判別機制,能分辨封包中的訊號是來 breezeAddIn然後就直接drop掉。一般測試最常見的情況就是 breezeAddIn可以成功連進 flashcom, 但通常最慢 5秒內就會被斷線,所有的video stream也不會寫入硬碟。
這讓我不禁想起去年 max 2004時跟 gary grossman聊到這件事,那時他一臉賊賊的招牌微笑,原來是早有暗留一招難怪老神在在毫不擔心,果然是真人不露相啊~
所以如果你是個 flashcom wanna-be或也想試試 screen sharing,簡單的答案是:人生苦短,找點別的事做可能更有意義。
□如果一定要 screen sharing怎麼辦呢?
好吧,在已經提醒過你人生唯苦無樂只有苦極滅道回道是岸才為上策後,如果你還是一心想要 screen sharing該怎麼辦呢?
可能的方案有幾個。
1、用 virtual driver: 這裏面最知名的就是 camtasia studio。camtasia是一套screen capture軟體,可以將畫面操作錄影下來,經過剪輯後再輸出成avi, mpg, swf等各種格式,頗受國內e-learning界與講師群喜愛,而它確實也是個中翹楚當之無愧。

camtasia另一個特異功能就是可以把自已模擬成一台web cam,一旦啟動它的 live 功能後,在flash player 裏的 camera listing就會看到一台名稱為 camtasia的webcam,這就是camtais偽裝而成的 virtual driver,此時就可以一邊錄畫面一邊將訊號餵進 flash player然後透過它傳進 flashcom。
根據兩三年前的測試結果,這招是百分之百成功的,那時我們也跟國內某大英語補習班合作開發了一些應用程式,但這條路也有個缺點,就是每套camtasia要價約三百美元(約一萬元台幣),而理論上來說,在合法使用的情況下,每個廣播發送電腦 (publisher) 都要安裝一套自已的license,因此如果同一時間有二十個老師要教課,或四十人要開會,就得買同等數量的license,這裏面所需的成本就不見得是可行的了。
過去幾年我也不斷找尋 C/C++高手幫忙開發類似的東西,因為理論上screen capture很容易,只要有人能將抓下來的 raw data轉成 virtual driver 送給 flash player即可,但根據好友兼長輩 b6s 兄的解釋,要寫出這樣一個 driver 不如直接找個密室修成肉身佛還快一點(呃 好吧 這不是 exactly wording, 但基本上很麻煩就對了,要自已從很底層的地方做起,並沒有高階的API可用)
2、用 vnc2swf: vnc是一個遠端遙控桌面的軟體,原理跟 screen capture沒啥兩樣,而 vnc2swf故名思意就是將 vnc的畫面轉成 swf(範例請看這裏),因此可能的下手處是改寫 vnc2swf的輸出端模組,讓它可以直接傳 flv到 flashcom上面,或是將此訊號轉成前面提過的 virtual driver (but again, this is a rawdata to virtual drviver issue, which is HARD)
但要特別注意的一點則是,vnc傳送一個 1024x768大小的畫面大約會吃掉 300kbps的頻寬,這還只是一個stream單向的傳輸,如果同時有二十個學生在上課,那就是 300*20 = 6000(將近6MBbps的頻寬),這些頻寬都是成本啊~
3、用白爛法: 有次一位合作的工程師突然說「那幹麼不直接拿web cam照螢幕就好?」頓時大家聽了真是額手稱慶鼓掌叫好,然後就是一頓亂打順便就地埋了,現在墳上的草應該也就一公尺了吧...
□真的需要 screen sharing嗎?
在看完上面一堆跟FMS2好像沒直接關連的閒聊後,你可以認真想想,真的有需要screen sharing 嗎?
這些年來我也曾抱者幾近極端份子的熱情嚐試各種可行的solution,但最後我終於發現一件殘酷的事實,那就是screen sharing其實是件很不實際的事。
並不是指技術上不可行(因為它已經被証明可行),而是指它所消耗的頻寬,與所能提供的品質實在不成正比。
上面是某次 Peldi's Coding Cafe抓下的畫面,圖中是他示範程式碼的部份,當時我瞪大眼睛把螢幕放到最大,也還是看不清楚他到底在打什麼,這件事突顯了一個事實:
即使技術上能將螢幕廣播出去,也很難達到清淅可接受的程度
而像 vnc 高品質的畫面則需用大量頻寬(也就是錢)堆出來,這使得screen sharing這件事變的幾乎無解。
另一方面,如果從「應用面」來看,不論是線上教學會視訊會議,其實最重要的元素都是影像、聲音與教材/簡報,其中影像與聲音用web cam就可以,而教材簡報則可以用眾多的 ppt to swf 轉換程式預先轉好,甚至是將ppt上傳到server供所有學員下載也是可行,因此,真的很難找到什麼應用模式是非用screen sharing不可的。
所以到這裏,你應該真的死心了吧?
□結語
經過幾天測試,基本上對 FMS2 已經有全盤的掌握,雖然特出的新功能不多(file/net access等眾API算是基本常識本來就要會的),但支援 edge server做clustering與 ON2 VP6 codec則是讓人心喜的部份,另外最重要的就是合理的定價讓人第一次開始覺得這是可以認真推的解決方案,也比較敢把 FMS2 包進專案規畫書裏呈現給客戶了



5 Comments Add your own
1. s22&hellip | November 1st, 2005 at 12:01 pm
好详细啊
2. 云梦雅&hellip | November 15th, 2005 at 1:47 pm
breezeAddIn.exe 哪可以下载到呀
3. jeremy&hellip | November 15th, 2005 at 3:17 pm
它只能透過flash player去下載,語法如下:
var m = new System.Product("breeze");
m.download();
但就如我在文章裏講的,不可能用它去做screen sharing的廣播,除非你想走的是另一條路...
4. b6s&hellip | November 15th, 2005 at 10:52 pm
hlb 找到了一個: http://www.componentx.com/ScreenShare/
不知道能不能跟 flash 結合。
5. jeremy&hellip | November 15th, 2005 at 11:27 pm
沒辦法,因為:
uses a peer-to-peer, serverless protocol and leverages standards such as JPEG image compression and TCP/IP
這代表者兩邊的user都得用他的軟體才能一播一接,也暗示者client軟體必需俱備聽port的能力,這是目前flash做不到的事,除非把flash包成standalone projector,但如果走這條路,就有太多選擇可用了,不見得一定要用這個。
目前比較有價值的部份是直接在client端模擬成一個 webcam WDM driver然後透過flash去廣播video。
但,他能透過p2p傳video的確是一大利多,跟上次另一位網友介紹的 video版 skype有異曲同功之效
Trackback this post | Subscribe to the comments via RSS Feed