



摘 要: 針對校內直播系統存在并發性能低下的問題,提出一種基于SRS開源軟件的校內直播解決方案。首先在CentOS的環境下部署Nginx和PHP,然后利用開源RTMP架構SRS結合開源編解碼庫FFmpeg實現視頻直播播放。Windows操作系統用戶安裝Flash插件進行播放和回放,移動端用戶通過HTTP方式進行播放和回放。實驗結果表明,該方案有極高的穩定性和實時性,并發性能高,視頻具有很好的質量。
關鍵詞: SRS; 開源軟件; 直播系統; 直播方案
中圖分類號: TN919.8?34; TP37 文獻標識碼: A 文章編號: 1004?373X(2016)16?0036?04
Abstract: Aiming at the poor concurrency performance existing in the campus live system, a solution about the campus live system based on SRS open source software is provided. First of all, Nginx and PHP is deployed under the environment of CentOS, and then open source RTMP architecture SRS combining with the open source codec library FFmpeg is adopted to realize video live broadcast. The users of Windows operating system can install Flash plug?in to perform their play and playback. The users of mobile terminal perform their play and playback via HTTP. The experimental results show that the solution can realize high stability, real?time performance, high concurrent performance and high quality video.
Keywords: SRS; open source software; live system; live scheme
0 引 言
近年來,隨著網絡技術和光纖技術在校園網的廣泛應用,網絡直播逐漸成為師生獲取信息的重要手段。校內的許多活動都可以借助網上現場直播方式傳遍全世界。西北農林科技大學在發展過程中不斷跟進現代教育技術的步伐,注重教學資源的積累和應用。學校多年來積累了豐富的校內資源、精品課程、國外資源等,這些珍貴的資源運用于教學過程中會對老師的教學和學生的學習有極大的幫助。隨著技術的進步和知識的更新,師生對于教學現場實況及電視節目等實時教學資源的需求越來越多。隨著3G,4G移動互聯網的發展,越來越多的師生希望通過移動終端實時訪問校內直播系統以滿足現代教學的需求。面對日益增長的用戶群,我校原有的直播系統已滿足不了師生利用多終端流暢觀看直播的需求。本文提出了基于SRS,FFmpeg,Nginx,PHP等開源軟件搭建的校內直播系統方案,用多媒體數字視頻資源來輔助高校網絡教學,以推動校園信息化建設。本系統采用開源軟件FFmpeg推流到SRS流媒體服務器對實時視頻流進行處理,實現視頻的直播。本文首先分析了FFmpeg庫、RTMP流媒體協議和SRS的基本原理,然后設計并實現了整個視頻直播系統的各個功能模塊,最后在實際測試環境中驗證了基于SRS校園開源直播系統的高并發性和穩定性。
1 直播系統設計方案
1.1 開源軟件和協議介紹
1.1.1 RTMP協議和RTSP協議
RTMP(Real Time Messaging Protocol)實時消息傳輸協議是用來進行實時數據通信的網絡協議[1],主要用在Flash/AIR平臺音視頻和數據通信。RTMP協議使用TCP協議作為其傳輸層的網絡協議,由于TCP可提供可靠交付的協議,因此在互聯網上傳輸時不會出現丟包情況,從而保證了用戶體驗[1]。
RTSP(Real Time Streaming Protocol)實時流協議是應用層控制協議[2],控制實時數據的發送。RTSP只對流媒體的數據傳輸起控制作用,傳輸數據一般由RTP協議類實現。采用RTSP + RTP這個組合來傳輸多媒體數據,在互聯網應用不是很多,原因在于RTP協議使用傳輸數據極易丟包的UDP協議作為其傳輸層的網絡協議。多媒體數據對丟包、時延、抖動有很高的要求,一點點小問題就會極大地影響用戶的體驗質量[3]。
SRS(Simple Rtmp Server)是MIT協議的開源流媒體服務器項目。項目由觀止創想公司CTO—winlin(楊成立)發起并維護[4],SRS的定位是運營級的互聯網直播服務器集群,追求更好的概念完整性和最簡單實現的代碼。選擇搭建基于RTMP/HLS直播服務器主要因為其簡單高效,SRS單進程能支持9 000并發,Nginx?rtmp單進程最多支持3 000并發,單進程的性能SRS是Nginx?rtmp的3倍。另外SRS在處理和管理HTTP流、RTMP流或者HLS流時也非常高效。
1.1.2 FFmpeg
FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,并能將其轉化為流的開源計算機程序。它提供了錄制、轉換以及流化音視頻的完整解決方案,包含了非常先進的音頻/視頻編解碼庫Libavcodec。多媒體視頻處理工具FFmpeg有非常強大的功能,包括視頻采集功能、視頻格式轉換、視頻抓圖、給視頻加水印等[5]。目前普通攝像機輸入流是RTSP流或MMS流,如果流媒體服務器接收的是RTMP流,就需要用FFmpeg進行視頻轉換。FFmpeg在Linux平臺下開發,但它也可以在Windows,Mac OS X操作系統下編譯運行,有良好的可移植性。
1.1.3 CentOS下的Nginx+PHP
Nginx (\"engine x\") 是一個高性能的HTTP和反向代理服務器,也有郵件代理服務器的功能。Nginx基于開源框架,能夠很好地解決高連接并發問題,能支持高達5萬個并發連接數的響應,并且同時占用內存和CPU資源消耗也低[6]。在高連接并發的環境下,Nginx是Apache服務器不錯的替代品。
PHP(Hypertext Preprocessor)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,主要適用于Web開發領域。PHP語法混合了C,Java,Perl以及PHP自創的語法獨成一體,其比CGI或者Perl能更快速地執行動態網頁。用PHP做出的動態頁面與其他的編程語言做出的動態頁面相比,PHP是將程序嵌入到HTML(標準通用標記語言下的一個應用)文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多[7];PHP還可以執行編譯代碼,通過編譯可以加密和優化代碼運行,加快代碼運行。PHP和Nginx的整合是通過PHP?FastCGI 來完成的。FastCGI 是一個可伸縮、高速的在web Server和腳本語言間通信的接口。其被許多腳本語言所支持,包括PHP以及多數流行的Web Server。
1.1.4 FlowPlayer
FlowPlayer是能將播放器內嵌到網頁的開源播放器,用戶可以自由定制播放器并配制播放器相關參數以達到想要的播放效果[8]。FlowPlayer功能豐富,能夠非常流暢的播放視頻文件,支持自定義配置和擴展,還能支持HTTP以及流媒體傳輸。
1.2 直播系統方案整體架構
該系統分為服務端和客戶端,其中客戶端分為Windows客戶端和移動終端(安卓系統移動終端和蘋果IOS移動終端)。我校采用普通高清攝像機采集圖像信息,通過話筒采集音頻信息。攝像機輸出的數據通過HDMI采集卡的高清接口傳數據到采集推流服務器上,圖像編碼采用H264編碼方式,音頻編碼采用AAC編碼方式。在采集推流服務器上通過FFmpeg將圖像和音頻封裝成RTMP協議流后通過校園網推送到SRS流媒體服務器。流媒體服務器通過校園網絡將RTMP數據流傳輸到PC和移動終端。校園內無線信號差的地方,流媒體服務器可以通過3G/4G網絡傳輸RTMP數據流直接到移動終端。直播系統結構如圖1所示。
2 直播系統模塊的設計
2.1 視頻的采集
采集(Ingest)指的是將文件(FLV,MP4,MKV,AVI,RMVB等),流(RTMP,RTMPT,RTMPS,RTSP,HTTP,HLS等),設備等數據,轉封裝為RTMP流(若編碼不是H264/AAC,則需要轉碼),推送到SRS。首先在直播用的服務器上安裝好HDMI采集卡的驅動,然后將高清攝像機與直播用的電腦通過HDMI采集卡的HDMI接口相連。通過直播電腦的HDMI采集卡采集攝像機的視頻流和音頻流并將采集到的數據保存在內存緩沖區ByteBuffer中以便FFmpeg進行編碼。
2.2 RTMP流的推送
在Linux平臺上,FFmpeg對V4L2的視頻設備提供了很好的支持,本文用FFmpeg做推流器。推流器的作用就是將本地的視頻數據推送到流媒體服務器。本文用FFmpeg將HDMI接口采集到的圖像數據和音頻數據通過流媒體協議RTMP以直播流的形式推送出去。RTMP采用的封裝格式是FLV,因此在指定輸出流媒體的時候需要指定其封裝格式為FLV。發送流媒體數據時要注意延時,否則FFmepg會瞬間發送大量數據,導致流媒體服務器癱瘓。本文在文獻[9]的基礎上改進了推送流程,如圖2所示。
2.3 SRS開源流媒體服務器
SRS流媒體服務器負責轉發和存儲流媒體,本文采用Nginx+PHP發布和管理視頻信息。SRS流媒體服務器將接收到的實時視頻存在dvr目錄的live文件夾下,最終生成FLV格式的視頻文件。接收到的實時流文件放在live目錄的live文件下。
(1) PHP和Nginx關聯或整合:
(2) 關聯后在Nginx/HTML下編寫index.PHP視頻播放網頁。將播放器FlowPlayer內嵌到播放網頁中,方便用戶通過網頁收看。為了更好地支持移動終端用戶觀看直播,本文在SRS配置了HLS分發:
hls {
enabled on;
hls_path /home/SRS/live;
hls_fragment 5;
hls_window 300;
}
(3) 下載并安裝開源軟件SRS,安裝后進行配置。服務器工作流程如圖3所示。
圖3 服務器工作流程圖
2.4 視頻的接收和播放
Windows客戶端首先通過HTTP get向Nginx服務器發送播放請求,Nginx服務器收到請求后下發直播地址給Windows客戶端,Windows客戶端通過Flash播放器接收直播流后直接播放。SRS配置好的HLS提供了一個M3U8列表。移動端首先通過HTTP get向Nginx服務器請求播放,Nginx服務器收到請求后下發訪問M3U8列表播放地址給移動端,移動端用前端網頁上的HTML5播放器進行直播節目的收看。
2.5 實驗與分析
根據上述方案,開發了視頻基于SRS的直播系統,該系統完全能承擔現場直播任務,用戶通過Windows終端和移動終端均可觀看直播視頻。本文對搭建的SRS直播服務器和原來用的Nginx?rtmp直播服務器的性能進行測試,SRS為單進程,Nginx?rtmp支持多進程,為了對比Nginx?rtmp也開啟一個進程。
硬件環境:系統為CentOS release 6.2(Final);CPU為AMD Opteron(tm) Processor 6376;內存為8 GB。
本次實驗使用云平臺劃分的2臺硬件配置相同的虛擬機,客戶端和服務器都運行于1臺機器,避開網絡瓶頸。用root登錄后用命令ulimit?n65535設置最大連接數,測試過程如下:
(1) 配置原有的Nginx?rtmp服務器,確保連接數沒有限制:
(2) 用搭建好的SRS服務器,確保連接數沒有限制。
(3) 將FFmpeg推流軟件分別安裝在兩臺搭建好的直播服務器后啟動FFmpeg循環推流,并在客戶端觀看。
(4) 使用Linux工具模擬RTMP客戶端訪問, st_rtmp_load為RTMP流負載測試工具,單個進程可以模擬1 000~3 000個客戶端。為了避免服務器過高負載,一個進程模擬1 000個客戶端。編譯:./configure make。啟動參數:./objs/st_rtmp_load ?c 1000 ?r
(5) 開始啟動st?load模擬客戶端并發測試SRS服務器和Nginx?rtmp服務器的性能。
啟動1 000客戶端:./objs/st_rtmp_load ?c 1000 ?r rtmp://127.0.0.1:19350/live/livestream >/dev/1
客戶端開始播放30 s以上,并記錄數據。期望帶寬:測試碼率乘以并發數。實際帶寬:指服務器實際的吞吐率。客戶端延遲:直播播放器的緩沖區設置為0.8 s。分別啟動 1 000,2 000,3 000,4 000,5 000,6 000,7 000,
8 000客戶端,記錄Nginx?rtmp和SRS的各項資源使用指標,測試性能對比如表1所示。
通過對測試數據的分析發現,在相同的連接數下,SRS直播服務器比Nginx?rtmp直播系統服務器消耗的資源要低,但實際占用帶寬有所增加。
3 結 語
本文通過組成的系統架構闡述了一個新的基于SRS的直播系統解決方案。詳細分析了各個模塊,設計并搭建了整套直播系統。同時,通過跟Nginx?rtmp架構的直播系統在性能方面對比測試,驗證了基于SRS的直播系統的高并發性和穩定性,為實現高可靠性和高并發性的視頻直播系統提供了新的可行的方法。
參考文獻
[1] 雷霄驊,姜秀華,王彩虹.基于RTMP協議的流媒體技術的原理與應用[J].中國傳媒大學學報(自然科學版),2013,20(6):59?64.
[2] 劉英德.基于單片機的3G流媒體監控技術[J].煤炭技術,2012,31(4):176?177.
[3] 蘇佳,姜秀華.IPTV視頻質量評估介紹[J].電視技術,2011,35(6):78?81.
[4] Media Center.萬眾矚目的SRS到底是個什么球[EB/OL]. [2015?10?01].http://www.chnvideo.com/blog?classic?srs.html.
[5] 劉大紅.基于RTSP流媒體服務器的設計與實現[D].西安:西安電子科技大學,2013.
[6] 劉全飛,周相兵.基于Nginx的站點管理系統設計與實現[J].電腦開發與應用,2015,28(1):8?10.
[7] 康舜禹,姜春風,劉松,等.“陽光下”服務交流平臺的開發與實現[J].吉林農業科技學院學報,2014,23(3):38?40.
[8] 魯寅輝.基于開源軟件的校園網絡視頻平臺設計與實現[J].華東師范大學學報(自然科學版),2015(z1):191?196.
[9] 雷霄驊.最簡單的基于FFmpeg的推流器[EB/OL]. [2015?10?01].http://blog.csdn.net/leixiaohua1020/article/details/39803457.