【摘要】通過剖析支持隨機播放HTTP協議流式視頻點播系統在服務器端、客戶端以及內容源的關鍵要求,提出對應實現技術特點,全面介紹了一種基于HTTP協議傳輸flv流式視頻并且支持隨機定位播放的視頻點播系統搭建技術。
【關鍵詞】HTTP協議;流式視頻;點播系統;隨機播放
【中圖分類號】G40-057【文獻標識碼】A【論文編號】1009—8097(2010)08—0052—03
引言
視頻點播系統(Video On Demand ,VOD)是當前媒體應用的一個熱點,在現代遠程教育中也是一項重要應用。采用流式視頻點播系統來支持教學視頻的傳輸,是大多數遠程教育試點高校正在使用的技術。當前普遍的流式視頻點播系統都是基于一些專用網絡傳輸協議搭建的,主要有mms協議、rtsp協議和rtmp協議等,這些協議都可以實現流式視頻點播系統,但因為其是私有協議,在一些網絡環境中使用會遇到一些因為協議不支持而不能正常使用的麻煩,此外采用了這類實現方式就不得不采用其專門軟件,特別是昂貴的專門服務器軟件。為了突破這樣一些困難,現在逐漸興起了HTTP協議流式視頻點播系統,這些系統不采用專門的服務器軟件,對客戶端要求也只是一些基于普遍應用的嵌入式小程序,供點播的流式視頻源也可以方便的獲得,所以逐漸成為了當前流式視頻點播應用的主流。本文就將介紹這類系統實現的關鍵技術。
一 流式視頻點播應用與點播系統簡介
一個流式視頻點播應用的過程是客戶端發起一個對某段內容的點播請求,服務器響應該請求,依據請求向客戶端傳輸視頻內容,客戶端接收到內容后進行解碼播放。不同于非流式視頻點播就在于客戶端不需要接受完所有的文件內容就可以開始播放。
可見視頻點播系統實現主要包括3個要素:服務器端、客戶端、流式視頻內容,其系統結構圖如圖1所示。

服務器端主要提供響應客戶端請求,向客戶端傳輸流式視頻數據;客戶端向服務器發起對具體內容的請求,在接受到傳輸來的流式視頻數據后實時解碼,實現內容展示;流式視頻內容是以一定格式編碼的視頻數據文件,其在服務器端表現為獨立存儲的專門文件。
流式視頻點播系統與視頻實時廣播系統主要區別就在于流式視頻內容不同,流式視頻點播系統中的流式視頻內容是預先編碼存儲好的,而實時廣播系統是由專門的實時編碼軟件實時傳輸過來的。
流式點播應用還分支持隨機定位播放和不支持隨機定位播放兩種形式。不支持隨機定位播放的點播指文件數據只能嚴格按照固有的順序進行傳輸,客戶端只能看到已經傳輸并緩沖在本地的內容,不能隨意的請求更后面的內容。反之,支持隨機定位播放的點播就可以不嚴格依照固有順序,能從播放內容中隨意的一個時間點開始播放。
二 支持隨機定位播放的HTTP協議流式視頻點播系統搭建的三個關鍵
要實現支持隨機定位播放的HTTP協議流式視頻點播系統需要使視頻點播系統的三個要素都滿足一定的要求,這就成為了系統實現的三個關鍵點。
1 服務器端要求:服務器端的關鍵是能在普通HTTP流式傳輸基礎上,能根據特殊的請求隨機從內容文件中定位開始傳輸新的數據,即能響應帶隨機定位標記的點播請求。其實這就類似于支持斷點續傳的HTTP服務,只不過斷點續傳中的續傳標記是數據傳輸中隨機分隔的,這里的定位標記需要按一定計算才能獲得,使得播放能夠重新建立。
2客戶端的要求:客戶端的關鍵是能在普通流式播放基礎上能夠通過計算提出正確的請求定位參數,并能夠實現隨機定位后的播放——從中途開始的播放。
3 流式視頻內容方面要求:流式視頻內容的關鍵是能夠支持服務器和客戶端隨機定位的請求,這一般需要特殊的內部數據組織。
三 系統實現
分析了系統的關鍵點,實現系統就變得比較簡單了,主要涉及三個方面。
1 流式視頻內容格式的選擇 在系統實現中我們以flv(FLASH VIDEO)視頻作為流式視頻內容格式。流式flv是當前最流行的視頻格式,廣泛被各大視頻網站采用,比如YouTube、土豆網等等。其可以方便地采用免費開源轉換軟件如ffmpeg和mencoder等從各類其他視頻格式轉換獲得。需要注意的是經過轉換的flv其實還不能滿足隨機定位播放的要求,還需要采用yamdi或者flv tools2 工具對flv文件進行metadata數據注入修正,經過metadata注入,flv文件上就有了整個視頻文件播放總時間以及視頻每秒對應的文件位置數據等信息,這為后面在客戶端計算出隨機播放定位時的文件頭位置提供了條件。metadata數據還包括了視頻原始分辨率、采用的編碼格式等信息,這都為實現視頻的播放提供了保障。
2 客戶端的實現 客戶端就是可嵌入普通web頁面內的flash小程序,程序可以用很多工具開發,為了使程序小巧,推薦直接采用ActionScript3開發,使用Flex SDK編譯生成swf格式程序,這可以使得最后程序為10k左右。ActionScript3編程時采用Flash9的原生播放器庫中的NetConnection 類、NetStream類以及Video類等就可以創建采用漸進式流媒體方式播放flv格式視頻的播放類了,但要實現隨機定位還需要進行專門的定制處理,這也不復雜,主要有這樣的2個步驟:
(1) 首次開始播放時加載flv文件metadata數據,提取并緩存總播放時間和每秒對應文件頭信息等數據;另根據metadata中視頻分辨率、編碼格式等信息建立播放環境開始播放視頻;
(2) 按時間的定位操作分成兩種形式:形式一是數據已經緩沖到客戶端,直接使用NetStream類提供的seek函數實現定位播放;形式二是數據還未緩沖到,則需要計算出定位時間所對應的文件頭,向服務器發出新的數據請求,重新緩沖后開始播放。
這里判斷是否已經緩沖到定位時間的條件有:
StartOff < SeekOff ————條件1
SeekOff < StartOff + BufferLoaded————條件2
StartOff是此次請求的文件頭偏移地址,首次定位前為0;
SeekOff是對應定位時間的文件頭偏移地址,這個通過來源于metadata數據查表獲得;
BufferLoaded是本次播放已經緩沖的數據量。
如果條件1和條件2同時滿足,即StartOff
3 服務器端的選用。服務器端可以采用常見的開源HTTP服務器,只要其支持HTTP流式數據即可,推薦使用Nginx或者lighttpd,因為這兩種服務器對flv格式有專門的優化,而且對隨機播放支持也已經有了相應的服務器擴展實現,我們采用的是Nginx。 默認Nginx實現flv點播支持時采用“start”為定位頭參數標記,如果你想定義自己的標記可以修改 ngx_http_flv_module 模塊并編譯替換系統默認的。在Nginx中的相關配置是在某個server配置中添加:
Location ~ \\.flv {
root<服務端數據路徑>; #<服務端數據路徑>需要指向真實目錄
flv;
}
至此一個完整的支持隨機定位播放HTTP協議流式視頻點播系統已經搭建起來。
小結
本文介紹的支持隨機定位播放HTTP協議流式視頻點播系統實際搭建比較方便,應用范圍廣泛。且該系統支持Linux和win32平臺等可跨平臺部署和使用,這進一步拓展了系統的應用空間。因為數據傳輸只采用了HTTP協議,所以有最好的網絡適應性,而且管理更方便。此外使用到的軟件都是開源免費的,這也降低了系統部署成本。囿于系統形式的不足,這個系統只支持秒級的隨機定位,而不支持毫秒等更精細的定位,但筆者認為這在大多數的點播應用中是完全能夠滿足要求的。在這一系統基礎上進行擴展能夠建立起更廣泛的應用,例如現在網絡教育中常見的教師講授視頻和展示同步顯示的點播應用就可以在此基礎上擴展實現。此外這一系統還可以很方便地擴展為支持mp4流式格式。
參考文獻
[1] W3C .HTTP - Hypertext Transfer Protocol[EB/OL].
< http://www.w3.org/Protocols.>
[2] Ing. Fabio Sonnati. Flash Video Technology[M].美國: Progetto Sinergia, 2006 .
[3] ADOBE. ActionScript 3.0 編程[M].美國:Adobe Systems Incorporated,2008:439-473.
[4] ADOBE.使用ActionScript3.0組件[M].美國:Adobe Systems Incorporated,2008:117-147.
[5] Nginx Community. NginxhttpFlvStreamModule[EB/OL].