Flash Media Server(FMS)應用一例

來源:互聯網
上載者:User
文章目錄
  • 一、需求是這樣的
  • 二、所需軟體
  • 三、所需硬體
  • 四、具體實施
  • 五、注意事項
  • 六、話題延伸
一、需求是這樣的

現有一個遊戲,伺服器端管理員要通過網路攝影機把遊戲示範實況記錄下來,用戶端網友可以通過瀏覽器觀看遊戲直播,伺服器端還提供一個小視窗查看用戶端看到直播視頻的模樣(以免出錯),同時可以暫停一下錄影(作假用^-^),用戶端網友以為只是網路卡了一下,不知情者並不知道怎麼回事!伺服器端的Flash如:

二、所需軟體

(1)Macromedia Flash

按需設計Flash程式或UI的IDE,因為本文討論程式簡單,無須下載專門的ActionScript開發工具,真有需求的話當然選擇官方的Flex Builder。

(2)Macromedia Flash Media Server(FMS)

Flash多媒體伺服器,用於把直接存放在伺服器上的多媒體檔案以流的方式廣播出去,這些多媒體檔案可以是FLV、MP3等格式,FMS另外一個功能就是實現直播流的接收和同步廣播。當然,通過瞭解還知道它有很多配置選項,用於控制服務的行為。

(3)IIS(可選)

如果你開發了一套線上視訊交談系統,你要把整個程式部署成功,除了上面的FMS還是不夠的,當然根據你系統的開發語言,也許可能不是IIS,而是Apache,或者是其它的伺服器軟體。

小提示:Macromedia早已被Adobe(Photoshop公司)收購了,更多使用方法可以到Adobe官方網站獲得。

三、所需硬體

一部充當伺服器和用戶端雙重角色的電腦、一個網路攝影機、一個麥克風(可選,大不了看無聲視頻,反正只是測試用)。

本人網路攝影機是用手機網路攝影機代替的,我用的是Symbian系統智能手機,然後用Mobiola Web Camera USB軟體把手機網路攝影機變成視頻網路攝影機並測試成功(),QQ視訊交談一樣適用。另外提示一下,如果你也沒有獨立的網路攝影機,但有一部可以攝影的手機,雖然不是智能手機,也許本身是可以當視頻網路攝影機用的,具體的你可以回去詳細看一下說明書。

四、具體實施

具體實施的思路描述應該是這樣的:要有兩個Flash檔案,一個部署在用戶端(網友查看那一端),這一端的Flash檔案只要接收FMS上指定的一個直播檔案流並播放就行了。而伺服器端則稍微複雜點,這一端要啟動本地網路攝影機,並把錄製的視頻以直播流的方式存到FMS伺服器上(直播流的方式不會在FMS上一直儲存錄製的視頻檔案,這對長時間直播而伺服器又沒有足夠大的硬碟空間情況下適用,當然這些視頻流無須備份,不同於銀行或小區的攝像錄影),同時因為伺服器端還要看一下用戶端實際看到的視頻樣子,所以還要有一個視頻控制項執行個體用於顯示從伺服器上即時取回的視頻流,另外還要有一個控制按鈕,用於控制停止和開始錄製視頻。如,沒有開始錄製時,因為用戶端使用者請求的視頻源還沒有,所以VideoSystemC.swf顯示空白。開始錄製後,伺服器端的VideoSystemS.swf大視窗和左上方小視窗看到的視頻將是一樣的,幾乎是同步的,因為我測試的攝影與FMS都在同一部電腦,所以較快,真正部署應用後,網友那一端可能會比這裡的小視窗顯示的畫面稍微滯後一點。

兩個Flash檔案代碼:

其中loadtxt.load("VideoMsg.txt");語句用於從同級目錄下載入VideoMsg.txt檔案中的變數。我沒有直接寫在FLA檔案裡是為了以後部署的方便,到時只要改一下這個記事本檔案就行,不用修改這個動畫的源檔案。VideoMsg.txt裡面存的內容是ServerUrl=rtmp://localhost/chat&PlayFileName=temVideo,這裡的“chat”是自己在FMS安裝目錄的applications目錄下建立的一個應用目錄名,“temVideo”是用於在FMS伺服器上儲存直播流的標識,“localhost”當然是伺服器位址,這個地址按實際情況修改。

(1)用戶端VideoSystemC.swf


Stage.scaleMode = "noScale";
Stage.showMenu = false;
var loadtxt = new LoadVars();
loadtxt.load("VideoMsg.txt");
loadtxt.onLoad = function(Success) {
    if (Success) {
        nc = new NetConnection();
        nc.connect(loadtxt.ServerUrl);
        nc.onStatus = function(info) {
            if (info.code != "NetConnection.Connect.Success") {
                if (info.code == "NetConnection.Connect.Failed") {
                    _root.msg.text = "視頻串連失敗···";
                } else if (info.code == "NetConnection.Connect.Rejected ") {
                    _root.msg.text = "視頻串連被伺服器拒絕···";
                } else {
                    _root.msg.text = "視頻正在串連中···";
                }
            } else {
                _root.msg.text = "";
            }
        };
        res = new NetStream(nc);
        view.attachVideo(res);
        view.attachAudio(res);
        res.play(loadtxt.PlayFileName);
    }
};

(2)伺服器端VideoSystemS.swf


Stage.scaleMode = "noScale";
Stage.showMenu = false;
var loadtxt = new LoadVars();
loadtxt.load("VideoMsg.txt");
loadtxt.onLoad = function(Success) {
    if (Success) {
        viewS.attachVideo(Camera.get());
        viewS.attachAudio(Microphone.get());
        nc = new NetConnection();
        nc.connect(loadtxt.ServerUrl);
        nc.onStatus = function(info) {
            if (info.code != "NetConnection.Connect.Success") {
                if (info.code == "NetConnection.Connect.Failed") {
                    _root.msg.text = "視頻串連失敗···";
                } else {
                    _root.msg.text = "視頻正在串連中···";
                }
            } else {
                _root.msg.text = "";
            }
        };
        nsOut = new NetStream(nc);
        _root.btn.label = "開始錄影";
        var flag = true;
        _root.btn.onRelease = function() {
            if (flag) {
                flag = false;
                _root.btn.label = "停止錄影";
                nsOut.attachVideo(Camera.get());
                nsOut.attachAudio(Microphone.get());
                nsOut.publish(loadtxt.PlayFileName, "live");
            } else {
                flag = true;
                _root.btn.label = "開始錄影";
                nsOut.attachVideo(null);
                nsOut.attachAudio(null);
            }
        };
        res = new NetStream(nc);
        viewC.attachVideo(res);
        viewC.attachAudio(res);
        res.play(loadtxt.PlayFileName);
    }
};五、注意事項

1、安裝完FMS,用正確的管理員帳號和密碼無法通過Management Console登入伺服器控制台,總是提示“嘗試登入失敗”,這很可能是你的防火牆或殺毒軟體引起的。拿本人安裝環境來說,我的電腦上安裝了“卡巴斯基”和“360安全衛士”,一開始也是發現登入失敗的,後來我逐步退出“卡巴斯基”和“360安全衛士”,退出“卡巴斯基”後還是登入不成功,最終退出“360安全衛士”就成功登入了,這表明是“360安全衛士”在搞鬼。

2、你發布的Flash檔案(SWF檔案)如果要與伺服器或外網通訊,直接運行是不行的,這是為了安全起見,我們可以把它部署到伺服器上,或者根據提示直接設定一下。

3、如果你訪問的Flash檔案要啟動本地網路攝影機,它會出現一個提示框,問你是否允許串連,當然要選擇允許,因為我們是知情的,不存在被偷拍的可能。據說有QQ強制視頻軟體,對方可以在你不知情的情況下通過啟動你的網路攝影機看到你的樣子。而Flash上面的限制就是為了防止此類事情的發生。

六、話題延伸

下面談談視頻其它幾種應用場合的實現原理:

(1)線上美女直播:美女直播自己的視頻給廣大網友,這個美女看不到網友的視頻。這就與本文討論的執行個體類似,此時美女充當了服務端的管理員。本文討論的FMS也是在同一部電腦上的,但是這裡的美女直播應用,FMS是不能在這個美女機子上的,她是通過FMS伺服器的IP地址或網域名稱來訪問遠程伺服器。同時,我們不希望同一時間只有一個美女在上面發布視頻,多美女發布視頻的時候,為每個人分配一個視頻儲存標識(通常你可能會用這個美女會員的ID帳號),然後把這些視頻標識存在資料庫,網頁中讀出這些線上美女直播列表就行了,使用者愛看哪個就點擊查看哪個。

(2)雙向互動視頻:網友和美女可以互相視頻,這就類似QQ的常用視頻功能。此時應該是一對一關聯性了,此時用戶端與伺服器端都要啟動網路攝影機,並把自己的ApsaraVideo for Live到FMS伺服器,雙方回調視頻的時候把Flash檔案視頻源請求到對方的源上就可以。

(3)網路會議:網路會議通常是超過兩個人的了,而且每個人都要能看到其他人的樣子,所以可以這樣理解,呈現在每個會議成員面前的Flash畫面應該是由很多小畫面組成的,每個小畫面對應一個會議成員,每個人的機子都要有網路攝影機和麥克風,都要把自己的視頻流直播到FMS上,然後每個人訪問的那個Flash檔案要一次請求所有會議成員的視頻源到本地顯示。很顯然,這對網速或頻寬有了更高的要求。其實視頻服務本來就不是一個小站長都能玩的,成本比較高,想想看現在人都喜歡看高清的,你搞出來的視頻服務不高清,人們不愛看,這樣你除了買昂貴的FMS伺服器及支付高額頻寬費,還要去買進階視頻採集卡之類的硬體。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.