陸莉莉+裴斌+張向通+孫延鵬+季一木
摘要:RTMFP(RealTime Media Flow Protocol,實(shí)時(shí)媒體流協(xié)議)是一種基于UDP的支持P2P安全協(xié)議。為了更好地滿足視頻監(jiān)控流的安全性和實(shí)時(shí)性,文中設(shè)計(jì)一種基于RTMFP的視頻監(jiān)控系統(tǒng)服務(wù)端和客戶端,并重點(diǎn)介紹了平臺(tái)的配置搭建、視頻流編解碼、視頻流發(fā)布流程和視頻流文件控制等模塊的設(shè)計(jì)和實(shí)現(xiàn)。
關(guān)鍵詞:對(duì)等計(jì)算;視頻監(jiān)控;流媒體
中圖分類號(hào):TP37 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)04-0208-03
Research of the Application and Analysis for Flash P2P Protocol
LU Li-li1,PEI Bing1,SUN Yan-peng2,ZHANG Xiang-dong1,JI Yi-mu2
(1.College of Software, Nanjing College of Information Technology, Nanjing 210046, China; 2.College of Computer, Nanjing University of Posts and Telecommunications, Nanjing 210023, China)
Abstract:RTMFP (Media Flow Protocol RealTime) was a kind of security protocol based on UDP and supported for P2P. In order to better meet the requirements of the safety and real-time of video monitoring, a video monitoring system server and client based on RTMFP was designed, and introduced the design and implementation of modules in the system, such as the configuration and building of the platform, video stream encoding and decoding, video streaming delivery process, video stream file control, and so on.
Key words:Peer to Peer; video control; flow media
1 背景
RTMFP使用UDP傳輸數(shù)據(jù)以提高數(shù)據(jù)傳輸速度,并采用類似TCP的連接建立方式,保證連接的可靠性[1]。FLASH P2P是由Adobe公司開發(fā)的基于Flash平臺(tái)實(shí)現(xiàn)的P2P技術(shù),該技術(shù)基于RTMFP [2],RTMFP協(xié)議為直播和實(shí)時(shí)通信程序提供了高質(zhì)量通信解決方案。
目前,RTMFP協(xié)議用在視頻流通信中,主要是用于視頻播放系統(tǒng)和視頻點(diǎn)播系統(tǒng)[3]。但是視頻監(jiān)控是當(dāng)前物流、交通、智慧小區(qū)和公安等應(yīng)用必備支撐技術(shù)之一,無(wú)線技術(shù)、P2P技術(shù)和EPON等[4-6]技術(shù)都應(yīng)用到視頻監(jiān)控系統(tǒng)中,但是這些監(jiān)控系統(tǒng)還是基于傳統(tǒng)的RTMP(RealTime Media Protocol,實(shí)時(shí)媒體流協(xié)議),由于視頻監(jiān)控內(nèi)容涉及用戶隱私,而RTMFP協(xié)議在傳統(tǒng)P2P和RTMP協(xié)議基礎(chǔ)上引入了安全機(jī)制[7],所以基于RTMFP協(xié)議搭建視頻監(jiān)控平臺(tái)具有很好的創(chuàng)新性和應(yīng)用價(jià)值。在FLASH P2P 技術(shù)中,兩個(gè)節(jié)點(diǎn)經(jīng)過服務(wù)器驗(yàn)證后可以彼此直接通信,降低了服務(wù)器端的帶寬需求。所以此方案很適合于大范圍的部署應(yīng)用,例如企業(yè)私有視頻點(diǎn)播(VOD)系統(tǒng)、實(shí)時(shí)視頻監(jiān)控、音視頻聊天和多人游戲等。RTMFP因?yàn)槭褂肬DP封裝,在提升傳輸速度的同時(shí),也需要通過兩個(gè)功能提高連接的可靠性。文中主要研究RTMFP協(xié)議在視頻監(jiān)控中的應(yīng)用以及H.264格式視頻的FLV封裝。
2 基于RTMFP的視頻監(jiān)控系統(tǒng)和實(shí)現(xiàn)架構(gòu)設(shè)計(jì)
圖1 基于RTMFP的視頻監(jiān)控系統(tǒng)架構(gòu)
基于RTMFP協(xié)議的FLASH P2P視頻監(jiān)控模塊整體架構(gòu)如圖1所示,具有視頻采集模塊、視頻編碼與發(fā)送模塊、P2P認(rèn)證與管理模塊和視頻播放模塊。其中,視頻采集模塊負(fù)責(zé)監(jiān)控視頻的采集,其中視頻監(jiān)控設(shè)備采用普通IP網(wǎng)絡(luò)攝像頭。視頻編碼與發(fā)送模塊將視頻流進(jìn)行H.264編碼并將H.264視頻以FLV格式封裝,封裝后以RTMP協(xié)議將視頻流發(fā)送給流媒體內(nèi)容服務(wù)器,P2P認(rèn)證與管理模塊負(fù)責(zé)P2P節(jié)點(diǎn)的RTMFP連接認(rèn)證以及P2P共享組的創(chuàng)建、維持與結(jié)束工作,視頻播放模塊播放顯示接收到的FLV視頻流。P2P節(jié)點(diǎn)間以RTMFP協(xié)議進(jìn)行數(shù)據(jù)通信以及視頻流數(shù)據(jù)傳輸。
為了實(shí)現(xiàn)圖1所示的架構(gòu),系統(tǒng)采用Flash Builder、Eclipse作為實(shí)現(xiàn)平臺(tái),使用ActionScript語(yǔ)言和JAVA語(yǔ)言進(jìn)行開發(fā)。其中,RTMFP協(xié)議分析模塊由JAVA編程實(shí)現(xiàn),視頻監(jiān)控模塊中視頻編碼與發(fā)送模塊由C++編程實(shí)現(xiàn),結(jié)果顯示模塊由ActionScript語(yǔ)言編程實(shí)現(xiàn)。監(jiān)控視頻數(shù)據(jù)以RMTPF協(xié)議傳輸。Flash Builder是一個(gè)軟件開發(fā)工具,由Adobe公司開發(fā)而成,可以作為Flash程序的開發(fā)平臺(tái)。視頻監(jiān)控模塊采用Cumulus作為節(jié)點(diǎn)的RTMFP認(rèn)證服務(wù)器,Cumulus 服務(wù)器具有跨平臺(tái)、體積小和可擴(kuò)展的優(yōu)點(diǎn),是一款可以支持RTMFP協(xié)議認(rèn)證的輕量級(jí)的開源腳本服務(wù)器。RTMFP視頻監(jiān)控模塊功能包括視頻采集、視頻編碼與發(fā)送和視頻播放,其中視頻采集采用普通IP攝像頭,然后視頻編碼模塊對(duì)攝像頭采集的視頻數(shù)據(jù)進(jìn)行H.264編碼并進(jìn)行FLV封裝并發(fā)送到內(nèi)容服務(wù)器。節(jié)點(diǎn)之間以RTMFP協(xié)議通信,OpenRTMFP/Cumulus服務(wù)器負(fù)責(zé)節(jié)點(diǎn)認(rèn)證,Tracker服務(wù)器負(fù)責(zé)P2P共享組的創(chuàng)建、維護(hù)、結(jié)束工作。
3 基于RTMFP的視頻監(jiān)控系統(tǒng)配置和主要功能實(shí)現(xiàn)
3.1 Cumulus 服務(wù)器安裝配置
本章設(shè)計(jì)的基于RTMFP的視頻監(jiān)控系統(tǒng)方案,采用Cumulus服務(wù)器作為認(rèn)證服務(wù)器[8]。Cumulus腳本服務(wù)器的主要有如下功能:1)支持p2p點(diǎn)到點(diǎn)服務(wù);2)支持現(xiàn)場(chǎng)直播;3)支持RPC,pull,push 切換,并能和所有的AMF客戶端與服務(wù)器端通信;4)支持通過腳本程序編寫應(yīng)用。5)支持功能擴(kuò)展;6)支持負(fù)載均衡。
Cumulus服務(wù)器由官方提供源代碼,若想啟動(dòng)并使用Cumulus服務(wù)器,可以先下載源碼自行編譯運(yùn)行,并且可以動(dòng)過編寫lua腳本程序個(gè)性化服務(wù)器功能。Cumulus服務(wù)器的編譯、安裝、配置過程如下:
Step1. 下載Cumulus腳本服務(wù)器源碼。//網(wǎng)站搜索下載
Step2. 下載并安裝POCO運(yùn)行庫(kù)。
cd D:\poco-1.4.8
"%VS100COMNTOOLS%\vsvars32.bat"
buildwin 100 build static_mt both Win32 nosamples devenv
打開(1)中下載的Cumulus服務(wù)器源碼工程,在“項(xiàng)目“屬性的附加包含目錄里添加下載的poco庫(kù)。
Step3. 下載并安裝openssl,結(jié)束后同Step2中一樣將代碼庫(kù)添加進(jìn)Cumulus工程中。
Step4. 編譯Cumulus:
OpenRTMFP-Cumulus/CumulusLib
make
cd ../CumulusServer
make
Step4. 進(jìn)行Cumulus服務(wù)器配置:
打開Cumulus/CumulusServer/CumulusServer.ini文件進(jìn)行如下修改可以完成對(duì)服務(wù)器的重新配置:
;CumulusServer.ini
port = 1935
udpBufferSize = 114688
keepAlivePeer = 100
keepAliveServer = 10
[logs]
name=log1
directory=C:/CumulusServer/logss
3.2 視頻編碼發(fā)送模塊實(shí)現(xiàn)
視頻編碼發(fā)送模塊是基于RTMFP協(xié)議的視頻監(jiān)控模塊中的核心部件,它主要實(shí)現(xiàn)以下功能:1)原始圖像數(shù)據(jù)的H.264編碼;2)對(duì)H.264編碼后的數(shù)據(jù)進(jìn)行Flv封裝;3)將封裝后的Flv格式視頻發(fā)送到流媒體內(nèi)容服務(wù)器。視頻編碼采用開源H.264視頻編碼器X.264,視頻經(jīng)H.264編碼之后調(diào)用視頻格式封裝函數(shù)將視頻數(shù)據(jù)封裝成Flv格式并發(fā)送給內(nèi)容服務(wù)器進(jìn)行分發(fā)。
1)原始圖像數(shù)據(jù)的H.264編碼壓縮
X.264只是提供源代碼庫(kù),沒有直接可用的接口,為了方便模塊的設(shè)計(jì)實(shí)現(xiàn),本文在將實(shí)現(xiàn)的視頻編碼與發(fā)送模塊中對(duì)X.264的編碼API進(jìn)行了重新封裝,以下是H.264編碼的具體實(shí)現(xiàn)過程:
2)轉(zhuǎn)換YUV以及RGB的顏色空間
首先原始的視頻數(shù)據(jù)可以通過一般的IP網(wǎng)絡(luò)攝像頭采集獲得,攝像頭獲取的初始視頻數(shù)據(jù)格式為RGB24。但是X.264標(biāo)準(zhǔn)要求,編碼的輸入流必須符合標(biāo)準(zhǔn)的YUV420的圖像采樣格式。所以,在進(jìn)行H.264編碼前,需要將視頻數(shù)據(jù)的RGB顏色空間進(jìn)行向YUV顏色空間的轉(zhuǎn)換。實(shí)現(xiàn)此功能的接口封裝為:
InitLookupTable(); //該接口的功能為色彩空間轉(zhuǎn)換前的初始化操作;
RGB2YUV420(int x_ dim, int y_ dim, unsigned char * bmp, unsigned char * yuv, int flip);
//該接口的功能為對(duì)色彩空間進(jìn)行實(shí)際轉(zhuǎn)換。
3)設(shè)置H.264編碼參數(shù)
對(duì)H.264編碼參數(shù)進(jìn)行設(shè)置,實(shí)現(xiàn)此功能的接口封裝為:x264_ param_ default(x264_ param_ t * param);
對(duì)當(dāng)前需要編碼的圖像參數(shù)進(jìn)行設(shè)置:需要對(duì)數(shù)據(jù)幀的數(shù)量、視頻數(shù)據(jù)的比特率、采樣圖像的高度以及長(zhǎng)度寬度、視頻數(shù)據(jù)的幀率等參數(shù)進(jìn)行設(shè)置,以完成編碼預(yù)設(shè)置。
4)初始化編碼器
第2)步中設(shè)置的編碼參數(shù)將作為編碼器的初始化參數(shù),實(shí)現(xiàn)此功能的接口封裝為:
x264_t *x264_encoder_open ( x264_param_t *param );
編碼器初始化失敗時(shí),函數(shù)將返回NULL,此時(shí)需要對(duì)編碼器初始化結(jié)果進(jìn)行處理。
5)進(jìn)行編碼空間分配
如果編碼器初始化成功,那么就要給此次編碼分配足夠的內(nèi)存空間,實(shí)現(xiàn)此功能的接口封裝為:
Void x264_picture_alloc(x264_picture_t *pic, int i_csp, int i_width, int i_height);
6)圖像編碼
最后將以上所有步驟初始化完成后的數(shù)據(jù)作為編碼輸入,然后通過以下接口封裝進(jìn)行圖像的編碼:
int x264_encoder_encode( x264_t *h,x264_nal_t **pp_nal, int *pi_nal,x264_picture_t *pic_in,x264_picture_t *pic_out );
7)資源回收
編碼結(jié)束以后,則回收系統(tǒng)資源并且關(guān)閉編碼器,實(shí)現(xiàn)此功能的接口封裝為:
void x264_picture_clean( x264_picture_t *pic );
void x264_encoder_close( x264_t *h );
至此,完成了對(duì)視頻采集模塊(普通IP攝像頭及其驅(qū)動(dòng)系統(tǒng))所采集的初始視頻數(shù)據(jù)的H.264編碼。進(jìn)行H.264編碼后的網(wǎng)絡(luò)抽象層單元(NALU)排列順序依次為:SPS-PPS-SEI-IDR-nonIDR---nonIDR。
3.3 H.264編碼數(shù)據(jù)的Flv封裝
視頻原始數(shù)據(jù)進(jìn)行H.264編碼結(jié)束之后,我們可以對(duì)編碼后的數(shù)據(jù)進(jìn)行Flv格式封裝。
Flv是二進(jìn)制文件,由兩部分組成,分別為Flv Header以及 Flv Body。而Flv Body由多個(gè)Prevoius Tag Size字段和Tag字段組成。Tag又可以細(xì)分成三種類別,分別為代表音頻流的audio標(biāo)志,代表視頻流的video標(biāo)志,以及代表腳本流的script標(biāo)志,同時(shí),每個(gè)tag在組成部分上有兩部分構(gòu)成,分別為Tag Header字段以及Tag data字段對(duì)。
Flv文件具體組成如下:
FLV header (9 byte)
previous tag size0(4byte ,默認(rèn)為00 00 00 00)
Metadata Tag(有關(guān)Flv視頻和音頻的參數(shù)信息,)
previous tag size(4byte,代表Metadata的長(zhǎng)度)
Video Tag1(視頻配置信息,大小通過計(jì)算獲得)
previous tag size1(占用4個(gè)byte 視頻配置信息大?。?/p>
Audio Tag2(音頻配置信息,大小通過計(jì)算獲得)
previous tag size2(占用4個(gè)byte 音頻配置信息大?。?/p>
…..
Tag N
previous tag size N。
從第四個(gè)Tag開始,Tag里內(nèi)容依次是音視頻數(shù)據(jù)及其前一個(gè)tag大小。
將H.264編碼數(shù)據(jù)進(jìn)行Flv封裝的實(shí)質(zhì)是把H.264視頻流數(shù)據(jù)以NALU為單位按上述Flv文件的結(jié)構(gòu)順序?qū)懭隖lv文件的tag中。具體的實(shí)現(xiàn)方式,參考附錄中關(guān)鍵代碼。
3.4 Flash客戶端實(shí)現(xiàn)
Flash客戶端為整個(gè)Flash P2P視頻監(jiān)控與分析系統(tǒng)的顯示模塊,其主要功能如下:1)多路監(jiān)控視頻流播放;2)RTMFP視頻傳輸協(xié)議分析模塊結(jié)果顯示。表1為視頻播放模塊所用到主要類。視頻的播放以及播放控制,主要通過NetStream類的方法。
表1 視頻播放模塊主要類
[Video類\&創(chuàng)建視頻對(duì)象,作為視頻流容器,對(duì)視頻文件進(jìn)行編碼處理。\&NetConnection類\&創(chuàng)建連接對(duì)象,連接遠(yuǎn)程服務(wù)器,獲取服務(wù)器認(rèn)證。\&NetStream類\&主要作用是創(chuàng)建資源發(fā)布或者接受流。該流的創(chuàng)建依賴于NetConnection對(duì)象。\&]
3.5 視頻播放流程
Flv格式封裝的視頻是Flash Player播放基本視頻格式??梢酝ㄟ^一些工具把其他的視頻文件格式轉(zhuǎn)換為.flv格式,比如Flash CS3自帶的工具Flash Video Encode,本文所用的視頻格式封裝方法為3.2所實(shí)現(xiàn)的視頻編碼發(fā)送模塊,經(jīng)過視頻編碼發(fā)送模塊編碼、封裝、發(fā)送后,顯示模塊所得到的視頻流為標(biāo)準(zhǔn)的Flv格式視頻流。
加載一個(gè)視頻文件并播放,通常可以分為三步實(shí)現(xiàn)。其步驟如下所示。
Step1:節(jié)點(diǎn)建立與服務(wù)器的連接進(jìn)行認(rèn)證或者建立與其他節(jié)點(diǎn)的連接。完成此步驟的代碼如下所示。
var nc1:NetConnection = new NetConnection();
nc.connect(RTMFP:\\);
Step2:創(chuàng)建視頻數(shù)據(jù)接收流。利用步驟1所建立的連接打通數(shù)據(jù)接收流,完成此步驟的關(guān)鍵代碼如下所示。
var ns1:NetStream = new NetStream(nc);
ns.play("monitor");
Step3:為即將播放的視頻流創(chuàng)建一個(gè)視頻容器。該視頻容器負(fù)責(zé)將接收到的視頻流數(shù)據(jù)進(jìn)行解碼操作。完成此步驟的代碼如下所示:
var vid:Video = new Video();
vid.attachNetStream(ns);
通過以上三個(gè)步驟的操作,視頻文件就被加載并播放。
3.6 視頻文件信息獲取
視頻流的信息包括視頻的持續(xù)時(shí)間、視頻顯示寬度及高度、視頻播放幀速等。顯示視頻流的信息可以通過調(diào)用onMetaData函數(shù),onMetaData回調(diào)函數(shù)可以獲取元數(shù)據(jù)的信息。
4 結(jié)束語(yǔ)
文中實(shí)現(xiàn)了RTMFP協(xié)議在視頻監(jiān)控中的應(yīng)用,并使用開源Cumulus服務(wù)器作為認(rèn)證服務(wù)器,能夠?qū)P攝像頭采集到的視頻數(shù)據(jù)進(jìn)行H.264壓縮編碼,然后封裝成適合Flash player播放的Flv格式,發(fā)送給視頻服務(wù)器進(jìn)行內(nèi)容分發(fā),用戶可以通過電腦、智能手機(jī)等設(shè)備進(jìn)行觀看。由于采用了Flash P2P技術(shù),使服務(wù)端帶寬開銷減少和服務(wù)端計(jì)算資源開銷也大幅度降低。為視頻監(jiān)控系統(tǒng)在智慧城市、智慧小區(qū)和智慧物流等領(lǐng)域的應(yīng)用推廣趕到借鑒作用,進(jìn)一步可研究基于視頻內(nèi)容的監(jiān)控和搜索。
參考文獻(xiàn):
[1] Campennì M. Adobe's RTMFP Profile for Flash Communication[J]. Journal of Theoretical Biology, 2014, 344(6): 49-55.
[2] Gao Q T, Liu J L, University T, et al. Application of RTMFP to P2P Video Communication[J]. Computer Systems & Applications, 2012.
[3] 陳木朝, 劉愛華. 基于RTMFP協(xié)議的視頻播放系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J]. 電腦編程技巧與維護(hù), 2013(18): 48-49.
[4] 付存宇. 基于 3G 網(wǎng)絡(luò)的嵌入式無(wú)線視頻監(jiān)控系統(tǒng)設(shè)計(jì)[J]. 計(jì)算機(jī)與現(xiàn)代化, 2013(4): 184-186.
[5] 董春利. 基于 EPON 技術(shù)的智能小區(qū)視頻監(jiān)控系統(tǒng)[J]. 光纖與電纜及其應(yīng)用技術(shù), 2013, 1: 011.
[6] 蘇愛國(guó), 郭世安, 王杰敏, 等. 基于 P2P 視頻監(jiān)控技術(shù)的應(yīng)急指揮系統(tǒng)研究[J]. 移動(dòng)通信, 2012, 36(6).
[7] Adobe's RTMFP Profile for Flash Communication[EB/OL].http://tools.ietf.org/html/rfc7425.
[8] Use RTMFP for developing real-time collaboration applications[EB/OL].http://labs.adobe.com/technologies/cirrus/.