邰非 謝周鵬 宋培龍
1.河海大學(xué)理學(xué)院;2.常州市中級人民法院信息處;3.南京航星信息技術(shù)有限公司研發(fā)中心
當(dāng)前網(wǎng)絡(luò)高清攝像機都內(nèi)置提供RTSP流服務(wù)[1-2],借助VLC等客戶端工具可以直接連接RTSP流來觀摩,也可以通過VLC所提供的組件服務(wù)或是其他第三方服務(wù)將接收流功能封裝成插件,結(jié)合行業(yè)業(yè)務(wù)流程實現(xiàn)應(yīng)用?;赪eb端的開發(fā)可以使用這些插件。在PC上通過Web頁面下載插件獲取RTSP流進(jìn)行播放,在移動端則通過小程序或插件載體來獲取流。無論是插件還是小程序都會帶來便捷性、安全性等方面的影響。HTML5雖然提供了視頻標(biāo)簽Video,但只支持MP4、WebM、OGG三種格式。本文所給出的實現(xiàn)架構(gòu)是通過Video.js庫來實現(xiàn)無插件RTMP播放流[1-2],并提出未來不支持flash瀏覽器上的無插件播放方案。
隨著網(wǎng)絡(luò)帶寬的不斷提高,流媒體的應(yīng)用也越來越廣泛,一方面客戶端從早先的PC機到現(xiàn)在的移動設(shè)備,如智能手機、iPad,另一方面服務(wù)端媒體網(wǎng)站提供了大量內(nèi)容豐富的音視頻資源,支持在線直播、點播等各種訪問方式。由此而產(chǎn)生了一系列的行業(yè)應(yīng)用,如基于流媒體交互式教學(xué)應(yīng)用的遠(yuǎn)程教育,還有各種網(wǎng)絡(luò)直播、點播及視頻會議系統(tǒng),雖然有些概念早期都有,但應(yīng)用內(nèi)涵是以靜態(tài)、單向、非富媒體的形式展現(xiàn),個人體驗、互動性、實時性等都不理想。如何將這些富媒體以方便的方式提供給各種類型的客戶端去使用,成為當(dāng)下應(yīng)用研究的一個焦點。本文主要針對的是富媒體為流媒體時,如何通過技術(shù)手段,讓客戶端在無插件的狀態(tài)下播放,眾所周知插件安裝會占用資源相對較少的移動設(shè)備,且會帶來安全性問題,而在移動設(shè)備已成支付首選工具的時代,安全性的問題更加突出。
RTSP全稱:Real Time Streaming Protocol,即實時流傳輸協(xié)議,屬于TCP/IP[2]應(yīng)用層協(xié)議,它定義了一對多應(yīng)用程序如何有效地通過I P網(wǎng)絡(luò)傳送多媒體數(shù)據(jù)。RTSP在體系結(jié)構(gòu)上位于RTP和RTCP之上,它使用TCP或UDP[2]完成數(shù)據(jù)傳輸。RTSP提供完整的交互過程,包括發(fā)起會話Session、創(chuàng)建傳輸機制SETUP、播放PLAY、錄制RECORD、停止TEARDOWN。這些特性易于控制流媒體播放[1],當(dāng)前很多高清網(wǎng)絡(luò)攝像機都內(nèi)置支持RTSP流服務(wù)。
RTMP全稱:Real Time Messaging Protocol,即實時消息傳輸協(xié)議,該協(xié)議屬于TCP/IP的應(yīng)用層協(xié)議,是用來進(jìn)行實時數(shù)據(jù)通信的網(wǎng)絡(luò)協(xié)議,主要用來在Flash/AIR平臺進(jìn)行音視頻和數(shù)據(jù)通信。包括支持RTMP協(xié)議的流媒體/交互服務(wù)器[3]。
對于RTSP流可以通過插件的形式在PC端播放,也可能通過小程序或插件的形式在移動端播放,但插件本身是受許多安全性限制,在使用上并不方便,而對于RTMP流來說,則不存在這樣的問題,只要瀏覽器支持Flash,就可以直接播放RTMP流。
如圖1所示,網(wǎng)絡(luò)高清攝像機提供了RTSP流,服務(wù)器端可通過拉流的方式,從這些攝像機上獲取音視頻流,再推送到RTMP服務(wù)器,RTMP服務(wù)器完成Http.flash或Http.flv格式封裝,提供給訪問的客戶端實現(xiàn)直播功能。RTMP服務(wù)器可選用Nginx服務(wù)器,該服務(wù)器提供RTSP拉流、RTSP轉(zhuǎn)RTMP、RTMP轉(zhuǎn)Http.flash或Http.flv的功能[4]。
圖1 RTSP轉(zhuǎn)RTMP架構(gòu)部署Fig.1 RTSP to RTMP architecture deployment
RTSP轉(zhuǎn)RTMP使用了FFmpeg技術(shù)。FFmpeg為開源項目,采用LGPL或GPL許可證,它可以用來錄制、轉(zhuǎn)換數(shù)字音視頻,并可以流的方式為客戶提供服務(wù),其底層使用了非常先進(jìn)的音視頻編解碼庫Libavcodec。本文的架構(gòu)中采用了該項技術(shù),實現(xiàn)RTSP轉(zhuǎn)RTMP,并按需求封裝成Http.flash或Http.flv格式的功能。另外通過FFmpeg命令還可以對多路RTSP流進(jìn)行合并處理,提供軟拼裝流的服務(wù)。
圖2 從協(xié)議、技術(shù)層面給出整個架構(gòu)實現(xiàn)的。源可能有兩種,一種是RTSP流源,市面上的高清攝像機基本都內(nèi)置這種協(xié)議,另一種是RTMP流源,需要專門定制,這類攝像機無需有固定IP即可推流,可直接接入云服務(wù)器做直播,相比于RTSP,如采用H.264和AAC編碼,則720P/30FPS僅需要512Kbps~1Mbps碼流,RTSP大約為3Mbps,可見會大大降低帶寬成本。就本文所提供的框架而言,如果前端攝像機提供RTMP流,可繞過RTSP流服務(wù)器,直接接到RTMP流服務(wù)器上,對RTMP流提供Http.flash或Http.flv封裝[4]就可以了。
圖2 協(xié)議轉(zhuǎn)換、封裝、播放技術(shù)關(guān)聯(lián)圖Fig.2 Association diagram of protocol conversion, encapsulation,and playback technology
如圖3給出了算法的關(guān)鍵流程。音視頻源有兩種,一種是RTSP源,另一種為RTMP源,如果是RTSP源則將其轉(zhuǎn)為RTMP源,這里提一下為什么要轉(zhuǎn)為RTMP流,因為這是實現(xiàn)Web頁面無插件播放的基礎(chǔ),插件本身會引發(fā)安全性問題,很多殺毒軟件和防火墻在默認(rèn)情況下是會攔截這類插件的下載與運行。
圖3 算法流程圖Fig.3 Algorithm flow chart
通過FFmpeg SDK,可以很方便地將RTSP流轉(zhuǎn)為RTMP流,RTMP流到達(dá)Nginx服務(wù)器,配置該服務(wù)器,可將RTMP再次封裝成Http.flash格式、Http.flv格式或HLS格式,這三種格式都是基于Http實現(xiàn)的,可以不受防火墻的限制。考慮到移動設(shè)備的瀏覽器內(nèi)核的差異性,將Android與ios兩大平臺分別處理,蘋果ios自帶瀏覽器只能播放HLS格式,Android自帶瀏覽器則可以播放另外兩種??紤]到2020年谷歌的Chrome、微軟的Edge不再支持Flash,需要對瀏覽器是否支持Flash作一個判斷,如果支持則使用Http.flash格式的流,不支持就采用Http.flv格式,Video.js庫和Flv.js庫[4]提供Http.Flv格式流的播放。另外Nginx服務(wù)器可以提供負(fù)載均衡,是目前較為流行的流媒體發(fā)布服務(wù)器。
對于另一些應(yīng)用場景,會有多畫面合成的要求,在源端可以進(jìn)行軟處理或硬處理,所謂軟處理是用FFmpeg SDK對多路流進(jìn)行合流編碼[5-6]。硬處理則利用采集板卡將多路采集信號合并成一路。前者效率低,延遲較大。后者效率高,延遲較小,但成本相對高。對于拼裝畫面在客戶端通過區(qū)域劃分與識別,可最大化焦點畫面,達(dá)到最佳的觀看效果。
流媒體技術(shù)是音視頻數(shù)據(jù)在互聯(lián)網(wǎng)上應(yīng)用最為廣泛的技術(shù)之一,無論是個人、學(xué)校、機關(guān)事業(yè)單位還是企業(yè),無不有其應(yīng)用場景,其易用性、安全性、健壯性會直接影響到用戶的體驗。通過各項技術(shù)的組合,可以為不同的客戶提供所需的解決方案。本文中所涉及的FFmpeg+Nginx技術(shù)架構(gòu)是結(jié)合客戶端的需求而提出的,在實際運用收到了良好的效果,當(dāng)然其中還有不足之處,如延遲問題,最好的方案是從采集源端直接定制,這是硬件廠商后面要做的工作。
引用
[1] 鐘玉琢.流媒體與視頻服務(wù)器[M].北京:清華大學(xué)出版社,2000.
[2] W.Richard Stevens.TCP/IP Illustrated Volume 1(The Protocols)[M].北京:機械工業(yè)出版社,2005.
[3] 孫曉剛.面向軟件工程的Visula C++網(wǎng)絡(luò)程序開發(fā)[M].北京:清華大學(xué)出版社,2004.
[4] 孫衛(wèi)琴.Tomcat與Java Web開發(fā)技術(shù)詳解(第2版)[M].北京:電子工業(yè)出版社,2009.
[5] 楊天路.P2P網(wǎng)絡(luò)技術(shù)原理與C++開發(fā)案例[M].北京:人民郵電出版社,2008.
[6] Martin Fowler.重構(gòu):改善既有代碼的設(shè)計(中文版)[M].北京:中國電力出版社,2006.