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