標籤:
http://www.ibm.com/developerworks/cn/opensource/os-cn-Red5/
Red5 是一個採用 Java 開發的開源免費 Flash 流媒體伺服器。Red5 基於 Java 和一些功能強大的開源架構,為企業級應用奠定了標準。它使用 RTMP,RTMPT,RTMPS 和 RTMPE 流媒體協議, 支援:將音頻(MP3)和視頻(FLV,MP4,F4V,3GP)轉換成播放流;錄製用戶端播放流;共用對象;現場直播流發布;遠程調用。Red5 為即時通訊,遠程教育,流媒體開發,多人線上遊戲等提供了一個簡單易行的方案。本文通過對 Red5 的介紹,讓讀者瞭解如何使用 Red5 快速搭建一個流媒體伺服器和如何在伺服器上開發部署相應的流媒體應用。
0 評論:
唐 學波, 軟體工程師, IBM
阮 高遠, 軟體工程師, IBM
2015 年 3 月 26 日
在 IBM Bluemix 雲平台上開發並部署您的下一個應用。
開始您的試用
引言
流媒體檔案是目前非常流行的網路媒體格式之一,這種檔案允許使用者一邊下載一邊播放,從而大大減少了使用者等待播放的時間。另外通過網路播放流媒體檔案時,檔案本身不會在本地磁碟中儲存,這樣就節省了大量的磁碟空間開銷。正是這些優點,使得流媒體檔案被廣泛應用於網路播放。
流媒體伺服器是通過建立發布點來發布流媒體內容和系統管理使用者串連的。流媒體伺服器能夠發布從視頻採集卡或攝像機等裝置中傳來的實況流,也發行就緒事先儲存的流媒體檔案,並且發布實況流和流媒體檔案的結合體。一個媒體流可以由一個媒體檔案構成,也可以由多個媒體檔案組合而成,還可以由一個媒體檔案目錄組成。
Flash Media Server,簡稱 FMS,是 Flash 大家庭裡的一員,被稱為是目前開發 Web 音視頻應用程式(比如,視訊交談室、視頻會議系統、播客系統、音視頻留言等等)的最方便最快捷的解決方案。也在 web 應用程式開發上有著越來越廣泛的應用。當然 FMS 這種優良功能並不是免費提供給廣大使用者的,幾千美金每個點的價格讓很多開發人員望而卻步。於是,大家開始嘗試尋找一種更合適的解決方案,開源的 Red5 便成為了人們的新寵。
Red5 是一個採用 Java 開發的開源的 Flash 流媒體伺服器,功能上與 FMS 類似。它支援:把音頻(MP3)和視頻(FLV)轉換成播放流;錄製用戶端播放流(只支援 FLV);共用對象;現場直播流發布;遠程調用。Red5 使用 RSTP 作為流媒體傳輸協議,包括線上錄製,Flash 流媒體播放,線上聊天,視頻會議等一些準系統。國內外基於 Red5 的流媒體應用產品也在不斷推廣,例如線上視頻會議 Openmeeting,大型 Flash 網遊功夫之王 2。
回頁首
流媒體簡介
隨著 Internet 發展,單純的文字和圖形已經遠遠不能滿足需求,而是逐漸向聲音和視頻等多媒體方向過渡。目前在網路上傳輸音頻/視頻等多媒體檔案時,一般有下載和串流兩種選擇。由於音頻/視頻包含大量的資料,所以他們佔據的儲存空間都比較大,在頻寬受限的網路環境中下載可能要耗費數分鐘甚至數小時,所以這種處理方法的延遲很大。如果換用串流的話,聲音、影像、動畫等多媒體檔案將由專門的流媒體伺服器負責向使用者連續、即時地發送,這樣使用者可以不必等到整個檔案全部下載完畢,而只需要經過幾秒鐘的啟動延時就可以了,當這些多媒體資料在客戶機上播放時,檔案的剩餘部分將繼續從流媒體伺服器下載。
流(Streaming)是近年在 Internet 上出現的新概念,其定義非常廣泛,主要是指通過網路傳輸多媒體資料的技術總稱。流媒體包含廣義和狹義兩種內涵:廣義上的流媒體指的是使音頻和視頻形成穩定和連續的傳輸串流和回放流的一系列技術、方法和協議的總稱,即流媒體技術;狹義上的流媒體是相對於傳統的下載-回放方式而言的,指的是一種從 Internet 上擷取音頻和視頻等多媒體資料的新方法,它能夠支援多媒體資料流的即時傳輸和即時播放。通過運用流媒體技術,伺服器能夠向客戶機發送穩定和連續的多媒體資料流,客戶機在接收資料的同時以一個穩定的速率回放,而不用等資料全部下載完之後再進行回放。
由於受網路頻寬、電腦處理能力和協議規範等方面的限制,要想從 Internet 上下載大量的音頻和視頻資料,無論從下載時間和儲存空間上來講都是不太現實的,而流媒體技術的出現則很好地解決了這一難題。目前實現流媒體傳輸主要有兩種方法:順序流(progressive streaming)傳輸和即時資料流(realtime streaming)傳輸,它們分別適合於不同的應用場合。
順序流傳輸
順序流傳輸採用順序下載的方式進行傳輸,在下載的同時使用者可以線上回放多媒體資料,但給定時刻只能觀看已經下載的部分,不能跳到尚未下載的部分,也不能在傳輸期間根據網路狀況對下載速度進行調整。由於標準的 HTTP 伺服器就可以發送這種形式的流媒體,而不需要其他特殊協議的支援,因此也常常被稱作 HTTP 串流。順序串流比較適合於高品質的多媒體片段,如標題、片尾或者廣告等。
即時資料流傳輸
即時資料流式傳輸保證媒體訊號頻寬能夠與當前網路狀況相匹配,從而使得流媒體資料總是被即時地傳送,因此特別適合於現場事件。即時資料流傳輸支援隨機訪問,即使用者可以通過快進或者後退操作來觀看前面或者後面的內容。從理論上講,即時資料流媒體一經播放就不會停頓,但事實上仍有可能發生周期性的暫停現象,尤其是在網路狀況惡化時更是如此。與順序流傳輸不同的是,即時資料流傳輸需要用到特定的流媒體伺服器,而且還需要特定網路通訊協定的支援。
回頁首
Red5 概述
Red5 是一個採用 Java 開發開源的 Flash 流媒體伺服器。免費開源使軟體更加容易擴充,下載後你可以對原始碼進行修改;更加經濟,比起 FMS 高昂的費用,Red5 能為一般的應用節約大筆費用;同時伺服器端的 Java 物件導向語言比起 FMS 伺服器端的 ActionScript2 語言更加成熟。鑒於 Red5 的種種優勢,推出不久便被廣大使用者所接受。
Red 5 支援:
1. 把音頻(MP3)和視頻(FLV, F4V, MP4, 3GP)轉換成播放流;
2. 錄製用戶端播放流, 把網路攝影機,麥克風等傳入的音頻視頻錄製儲存到伺服器;
3. 共用對象;
4. 現場直播流發布;
5. 遠程調用;
6. 協議:RTMP, RTMPT, RTMPS, and RTMPE。
為了便於開發人員進行二次開發,Red5 提供了很多介面。
表 1.Red5 常用介面
介面 |
描述 |
IConnection |
連線物件。每個串連都有一個關聯的用戶端和域。串連可能是持續型、輪詢型、或短暫型。建立此介面的目的,是為了給不同的子類,如 RTMPConnection,RemotingConnection,HttpConnection 等,提供基礎通用的方法。通過該介面提供的 getClient() 方法可以方便地擷取客服端對象。 |
IScope |
每個 Red5 應用程式至少有一個域,用來搭建處理器、環景、伺服器之間的串連。域可以構成樹形結構,所有用戶端都可以作為其節點共用域內的對象(比如流和資料)。所有的客服端 (client) 通過串連 (connection) 串連到域中。對於單一域,每個串連對應一個用戶端,每個用戶端對應一個 id,簡單的應用,操作就針對一個 id 和一個串連進行。 |
IServiceCapableConnection |
擷取有效串連。代碼中先擷取到串連執行個體,然後判斷是否是有效串連並強制類型轉換,之後調取用戶端相應函數。 |
IClient |
用戶端對象代表某單一用戶端。一個用戶端可以和同一主機下不同的域分別建立串連。用戶端對象和 HTTPSession 很相像。可以使用 IClientRegistry.newClient(Object[]) 方法來建立 IClient 對象。 |
ApplicationAdapter |
ApplicationAdapter 是應用程式層級的 IScope。若要處理流進程,需實現 IStreamAwareScopeHandler 介面中的相應處理方法。ApplicationAdapter 還提供了有效事件處理機制,來進行截取流、確認使用者等操作。同時,其子類中引入的方法均可在用戶端通過 NetConnection 調取。在 Aodbe 的 FMS 中必須在伺服器端維護用戶端對象,與之相較,Red5 為您的遠程請求提供了更加方便快捷的操作方法。 |
回頁首
Red5 安裝準備工作:
一、JAVA 環境配置:下載的 JDK 安裝包,本文選擇的是 jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe。
二、確認你的安裝環境並選擇 Red5 安裝包:如果是 Windows 作業系統,可以下載對應的安裝檔案 Red5 0.9 RC2(本文寫作時使用的該版本),如需下載最新版本或瞭解 Red5 其他相關資訊,可以參考該頁面 https://github.com/Red5/red5-server。
準備工作完成,一切就緒。
安裝工作:
步驟一:首先安裝上面下載的 JDK 安裝包(備忘:如果你先安裝 Red5,會提示找不到 JDK,你必須先完成步驟一再繼續以下操作)。安裝時首先安裝 JDK,必須記住安裝路徑,保持預設即可,預設是 C:\Program Files\Java\jdk1.6.0_10,然後安裝 JRE, 保持預設即可,預設是 C:\Program Files\Java\jre6。安裝完成後,必須配置環境變數,我的電腦–>屬性–>進階 選項卡–>環境變數 (N)–>找到 系統變數 (S) 下 建立(W),然後輸入 變數名(N):JAVA_HOME,變數值(V):上面 JDK 安裝路徑 C:\Program Files\Java\jdk1.6.0_10,確定即可,JDK 準備就緒。
步驟二:安裝 Red5,安裝 Red5 時,會要求輸入外網可訪問的 IP, 比如 121.52.209.62, 然後輸入可訪問的連接埠(Port),一般是 5080, 最後安裝完成即可。
回頁首
Red5 簡單的應用執行個體
經過上面精彩的介紹,相信大家對 Red5 會有所興趣,在這裡我給大家用一個簡單的應用執行個體,僅以登入過程為例,來協助大家更好的理解 Red5 中的一些概念和模型。本應用執行個體中,Server 端基於 Red5 0.9 RC2 採用 Java 編寫,而 Client 端則採用 Action Script。
圖 1. 項目結構
由於 Red5 是在 Tomcat 中啟動並執行,因此 Red5 項目與普通 JAVAEE 項目結構類似。不同點在於,Red5 的設定檔需要加上“red5-”首碼,在 Tomcat 啟動時,所有“red5-”被預設為 Red5 Server 的設定檔而不會被 Tomcat 載入,而後當 Red5 啟動時才會載入相應的設定檔。讓我們來看看 red5-web.xml 中都有哪些組成部分。
清單 1. red5-web.xml 中 Context 部分
<bean id="web.context" class="org.red5.server.Context" autowire="byType"><property name="scopeResolver" ref="red5.scopeResolver" /><property name="serviceInvoker" ref="global.serviceInvoker" /><property name="mappingStrategy" ref="global.mappingStrategy" /><property name="clientRegistry" ref="IloveClientRegistry" /></bean>
清單 1 中前三項 Property 為 Red5 項目預設的屬性。第四項“ClientRegistry”為項目自訂的 Context, 主要用於實現使用者註冊的功能。
清單 2. red5-web.xml 中 Scope 部分
<bean id="web.scope" class="org.red5.server.WebScope" init-method="register"><property name="server" ref="red5.server" /><property name="parent" ref="global.scope" /><property name="context" ref="web.context" /><property name="handler" ref="web.handler" /><property name="contextPath" value="${webapp.contextPath}" /><property name="virtualHosts" value="${webapp.virtualHosts}" /></bean>
清單 2 中定義了 Red5 項目中 Scope 的預設值。如需要可以添加自己定義的 Scope,並給它賦值。
清單 3. red5-web.xml 中 Handler 部分
<bean id="web.handler" class="org.red5.server.webapps.Ilove.Application"><property name="userInfoService" ref="userInfoService" /></bean>
清單 3 重載了 web.handler,因此當有 Client 與 Server 提出串連請求時,org.red5.server.webapps.Ilove.Application 將被用於處理客戶請求。
接下來我們看下如何?從 Flash 用戶端調用 Red5 應用的方法,以及如何使用 Scope 來判斷使用者登入狀態。
圖 2. 用戶端登入圖 3. 登入介面
圖 2 中展示了 Flash 用戶端中 ActionScript 面對不同 Connection 狀態的處理方法。由 Flash 用戶端發起的登入請求,首先需要判斷當前與 Server 的 Connection 狀態, 只有狀態為”NetConnection.Connect,Sucess”時, 才可以向 Server 端調用方法“logicProcess”。 圖 3 中展示了不同 Connection 狀態時 Flash 用戶端會給出的提示。
清單 4. LoginInterface
public interface LoginInterface extends IStreamAwareScopeHandler {……//使用者登入時伺服器端調用當前 connection 的方法public String loginProcess(String[] args) throws FileNotFoundException,ParserConfigurationException, SAXException, IOException;//使用者登入時伺服器端報錯調用當前 connection 的方法public void systemError();/**使用者登出時用戶端端調用當前 connection 的方法 * * @param userName 需要剔除的使用者名稱 */public void logoutProcess(String userName); ……}
如清單 4 所示,org.red5.server.webapps.Ilove.Application 實現了 LoginInterface 介面, 其中定義了一些用戶端可見的方法名稱。因為 org.red5.server.webapps.Ilove.Application 被定義為項目的 Handler,類中所有 public 方法都可以被用戶端調用。
清單 5. 使用者登入
public String loginProcess(String[] args) throws FileNotFoundException,ParserConfigurationException, SAXException, IOException {final IConnection conn = Red5.getConnectionLocal();if (conn.getClient() == null)return SystemContent.NO_ENTRY;final IScope scope = conn.getScope();final IClient client = conn.getClient();final int code = (Integer) client.getAttribute("codeName");//檢查當前登入衝突if (code == SystemContent.STATUS_CODE_DUPLICATEUSER) {//此使用者名稱已登入,notify 用戶端不允許重複登入if (model.statusMap.get(args[0]))return SystemContent.NO_ENTRY;//如果沒有使用者登入,則更新資料庫中 session 值為目前使用者else {this.userInfoService.updateSession(args[0], (String) client.getAttribute("currentId"));}}//如果通過驗證,則 client 應該為 IloveStreamClient 類型if (client instanceof IloveStreamClient) {boolean authenticated = ((IloveStreamClient) client).isAuthenticated(); //當前驗證狀態if (authenticated) { synchronized (model.statusMap) {model.statusMap.put(args[0], true);refreshUserList(conn, args[0], "refresh");refreshUserList(conn, args[0], "add");}invokeClientMethod(conn, "declarePublicSo",new Object[] { "chatingSO" }, null);messageAdapter.sendPublicMessage(so, "歡迎登入!" + args[0], "系統機器人");final String scheduleName = this.addScheduledJob(5000,new IloveUserListChecker(conn, args[0]));scope.setAttribute((String) client.getAttribute("currentId"),scheduleName);return args[0] + " found";}}return args[0] + " not found";}
如清單 5 所示,程式首先通過 Red5 的 GlobalScope 擷取目前使用者的 Credential,因為每個 Connection 在 Scope 中都是獨立存在的。登入過程中會判斷目前使用者是否重複登入,或者登入資訊是否正確。只有當使用者為 Authenticated 狀態時,伺服器端才會調用 Flash 用戶端的方法,同時產生 shared Object 以協助 Flash 用戶端初始化介面。
回頁首
Red5 應用的部署
Red5 0.9 RC2 中已經內嵌了 Tomcat 伺服器。因此 Red5 應用的部署和普通 JavaEE 應用在 Tomcat 中的部署方式是一樣的。這裡需要注意的是,上文中提到的 XML 設定檔必須是正確的,以防止運行報錯。圖 4 中是一個基於 Red5 應用的視訊交談系統,當使用者登入成功後,可以在當前的聊天室中與其他已登入使用者進行文字交談或者視訊交談。具體功能的實現就不在本文中闡述了。
圖 4. 視訊交談系統介面
回頁首
結束語
Red5 是一個採用 Java 開發的開源 Flash 流媒體伺服器。Red5 同時具備了 Flex、Java 的優點,且具有比 Flex 更強的優勢。Red5 為即時通訊,遠程教育,流媒體開發,網路線上遊戲等提供了一個簡單易行的方案。本文通過對 Red5 的介紹,讓讀者瞭解如何使用 Red5 快速搭建一個流媒體伺服器以及如何在伺服器上快速開發部署相應的流媒體應用。
參考資料學習
- Red5 源碼下載,從 GitHub 上擷取 Red5 原始碼。
- ActionScript, 參考 Adobe 網頁,深入瞭解 ActionScript3.0 的特性。
- developerWorks 開源技術主題:尋找豐富的操作資訊、工具和項目更新,協助您掌握開源技術並將其用於 IBM 產品。
討論
- 加入 developerWorks 中文社區,查看開發人員推動的部落格、論壇、組和維基,並與其他 developerWorks 使用者交流。
基於 Red5 的流媒體伺服器的搭建和應用