一種RTSP嵌入式視頻監(jiān)控系統(tǒng)的設(shè)計(jì)
RTSP:即時(shí)串流協(xié)定(Real Time Streaming Protocol,RTSP)是用來(lái)控制聲音或影像的多媒體串流協(xié)議,并允許同時(shí)多個(gè)串流需求控制,傳輸時(shí)所用的網(wǎng)絡(luò)通訊協(xié)定并不在其定義的范圍內(nèi),服務(wù)器端可以自行選擇使用TCP或UDP來(lái)傳送串流內(nèi)容,它的語(yǔ)法和運(yùn)作跟HTTP 1.1類似,但并不特別強(qiáng)調(diào)時(shí)間同步,所以比較能容忍網(wǎng)絡(luò)延遲。而前面提到的允許同時(shí)多個(gè)串流需求控制(Multicast),除了可以降低服務(wù)器端的網(wǎng)絡(luò)用量,更進(jìn)而支持多方視頻會(huì)議(Video Conference)。
本文引用地址:http://m.butianyuan.cn/article/201610/309224.htm基于以太網(wǎng)的嵌入式視頻監(jiān)控得到越來(lái)越廣泛的應(yīng)用,如通過(guò)3G網(wǎng)絡(luò)傳給服務(wù)器,將移動(dòng)機(jī)器人所采集到的視頻數(shù)據(jù)通過(guò)3G網(wǎng)絡(luò)傳給服務(wù)器。流媒體技術(shù)也在不斷的普及,將目前流行的流媒體傳輸技術(shù)應(yīng)用到視頻監(jiān)控系統(tǒng)中是比較好的選擇,既不會(huì)占用太多的網(wǎng)絡(luò)帶寬,也可以實(shí)現(xiàn)較為流暢視頻監(jiān)控。本文基于H264編碼技術(shù)和對(duì)Live555二次開(kāi)發(fā),設(shè)計(jì)了一種可對(duì)柑橘生長(zhǎng)進(jìn)行視頻實(shí)時(shí)采集,編碼,傳輸?shù)那度胧搅髅襟w視頻監(jiān)控系統(tǒng)。
1 網(wǎng)絡(luò)監(jiān)控視頻技術(shù)簡(jiǎn)介
RTSP(Real Time Streaming Protocol),即實(shí)時(shí)流傳輸協(xié)議,屬于TCP/IP協(xié)議體系顧名思義,它是一個(gè)用于流媒體傳輸控制的協(xié)議,能夠控制流媒體在傳輸過(guò)程中的暫停與繼續(xù),從而方便用戶實(shí)現(xiàn)播放器的一些基本播放功能。它也以C/S方式(客戶端服務(wù)器)工作,由于結(jié)合了很多技術(shù)上的優(yōu)點(diǎn),目前在因特網(wǎng)視頻應(yīng)用中廣泛流行。
圖1 RTSP與RTP、RTCP關(guān)系
RTSP協(xié)議與RTP(Real Time Protocol)協(xié)議、RTCP(Real Time Control Protocol)的關(guān)系如圖1所示,通常而言,RTSP只用來(lái)傳輸控制信息,這些控制信息使得媒體播放器能控制流媒體的傳輸,而流媒體的傳輸則由RTP負(fù)責(zé),所以RTSP協(xié)議必須與RTP/RTCP協(xié)議一起配合使用。
1.2 H.264技術(shù)
H.264技術(shù)是目前在視頻編碼壓縮中采用的最為普遍的一種技術(shù)。由于H.264具有更低的碼率,在同等圖像質(zhì)量的前提下,它可以達(dá)到更高的壓縮率,與前代MPEG-2相比,壓縮比通常是它的2倍以上;H.264在算法方面更加復(fù)雜,所以它相比上代壓縮技術(shù)也能夠提供高質(zhì)量的圖像。而且它的容錯(cuò)能力也很強(qiáng),網(wǎng)絡(luò)適應(yīng)能力非常好。在本設(shè)計(jì)中,對(duì)于動(dòng)態(tài)變化不是很明顯的視頻,H.264顯示出了非常強(qiáng)大的壓縮能力,使得網(wǎng)絡(luò)帶寬大大減少。本設(shè)計(jì)只采用了H.264的編碼部分,應(yīng)用目前最為流行的符合H.264規(guī)范的x264工程作為編碼器。
1.3 Live555開(kāi)源工程
Live555是一個(gè)開(kāi)源項(xiàng)目,使用C++語(yǔ)言編譯,為RTSP、RTP/RTCP、SIP等標(biāo)準(zhǔn)流媒體傳輸協(xié)議提供解決方案,支持目前主流的ts、mpg、mkv、h264格式的視頻,被大多數(shù)流媒體服務(wù)器應(yīng)用為開(kāi)發(fā)平臺(tái),VLC、ffplay等多款播放器能夠點(diǎn)播使用Live555作為流媒體服務(wù)器的視頻數(shù)據(jù)。Live555有四個(gè)基本的庫(kù),即BasicUsageEnvironment、UsageEnvironment、GroupSock和LiveMedia。前面三個(gè)庫(kù)在本設(shè)計(jì)中均不需要改動(dòng),需要改動(dòng)的是LiveMedia模塊,它是Live555最重要的模塊。這個(gè)模塊的主要作用是聲明一個(gè)Medium類,在Live555工程中,很多其他類都是它的派生類。
1.4 YUV圖像數(shù)據(jù)分析
常用的YUV元素圖像格式有YUV422格式和YUV420格式。YUV422格式中,按照U、V在時(shí)空上的排列順序不同,可以將他們分為YUYV,YVYU,UYVY,VYUY四種不同的排列方式,目前大部分USB攝像頭輸出的原始圖像都是按照YUYV格式來(lái)排列的;按Y和UV的排列方式不同又可以分為打包格式和平面格式,打包格式通常以英文字母planner表示,而平面格式則會(huì)用interlaced表示,打包格式較為常見(jiàn),它的Y分量和UV分量在內(nèi)存中是連續(xù)放置的,如圖2右側(cè)的示意圖所示,而平面格式Y(jié)和UV分量則是分開(kāi)放置的,如圖2左側(cè)示意圖所示。
圖2 YUV排列格式示意圖
YUV420在排列上和YUV422規(guī)律相同,但是Y:U:V是4:1:1的。一般情況下,利用V4L2采集USB攝像頭的視頻數(shù)據(jù)是YUYV交錯(cuò)排列的打包YUV422格式的,但是H264編碼庫(kù)要求輸入的視頻格式是YUV420P,也即4:1:1的平面格式,所以要經(jīng)過(guò)轉(zhuǎn)換。本設(shè)計(jì)采用成熟的libswscale庫(kù)來(lái)轉(zhuǎn)換原始圖像數(shù)據(jù)。
2 流媒體服務(wù)器的實(shí)現(xiàn)
2.1 系統(tǒng)整體結(jié)構(gòu)
本設(shè)計(jì)參考目前流行的視頻監(jiān)控系統(tǒng),基于Linux的平臺(tái),利用V4L2(Video for Linux Two)函數(shù)接口,采集USB攝像頭傳過(guò)來(lái)的數(shù)據(jù),因目前一般的USB攝像頭只支持YUYV排列的YUV422格式的數(shù)據(jù)采集,因此需要將采集到的數(shù)據(jù)格式轉(zhuǎn)換為YUV420P之后,再利用x264對(duì)每一幀YUV數(shù)據(jù)進(jìn)行編碼,最后對(duì)Live555開(kāi)源工程進(jìn)行二次開(kāi)發(fā),構(gòu)建流媒體服務(wù)器。本設(shè)計(jì)系統(tǒng)總框圖如圖3所示。
圖3 系統(tǒng)架構(gòu)圖
在本設(shè)計(jì)中,系統(tǒng)平臺(tái)為L(zhǎng)inux,USB攝像頭的型號(hào)為環(huán)宇飛揚(yáng)v8,只支持輸出YUYV排列的YUV422格式的圖像數(shù)據(jù),x264目前只支持YUV420P的圖像數(shù)據(jù)輸入,因此為了保證穩(wěn)定可靠,采用FFmpeg工程中的libswscale對(duì)其進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換,最后利用構(gòu)建好的RTSP服務(wù)器對(duì)編碼的數(shù)據(jù)進(jìn)行實(shí)時(shí)發(fā)送傳輸。
2.2 構(gòu)建流媒體服務(wù)器
對(duì)于不同的流媒體源,其數(shù)據(jù)排列格式不同,因而獲取SDP的方法不同。在構(gòu)建新的流媒體源的基礎(chǔ)上,需要對(duì)SDP獲取部分代碼進(jìn)行二次開(kāi)發(fā)。因此,本設(shè)計(jì)的工作分為下面兩部分。
2.2.1 SDP獲取代碼二次開(kāi)發(fā)
當(dāng)RTSPServer收到對(duì)某個(gè)媒體的DESCRIBE請(qǐng)求時(shí),它會(huì)找到對(duì)應(yīng)的ServerMediaSession,調(diào)用ServerMediaSession::generateSDPDescription()。generateSDPDescription()中會(huì)遍歷調(diào)用ServerMediaSession中所有的調(diào)用ServerMediaSubsession,通過(guò)subsession->sdpLines()取得每個(gè)Subsession的sdp,合并成一個(gè)完整的SDP返回之。對(duì)于不同流媒體格式獲取SDP信息的方式不同,因此,本設(shè)計(jì)基于OnDemandServerMediaSubsession類構(gòu)建新的會(huì)話類WebcamOndemandMediaSubsession。
圖4 獲取SDP函數(shù)調(diào)用關(guān)系圖
獲取SDP信息的函數(shù)調(diào)用關(guān)系如圖4所示,sdpLines()函數(shù)在OnDemandServerMediaSubsession類中已經(jīng)實(shí)現(xiàn),為了順利的獲取SDP信息,我們需要對(duì)sdpLines()運(yùn)行時(shí)調(diào)用的幾個(gè)函數(shù)作一定的修改,因此,需要對(duì)OnDemandServerMediaSubsession類中的幾個(gè)虛函數(shù)進(jìn)行重載,具體做法如下:
A、對(duì)于createNewStreamSource函數(shù),因?yàn)楸驹O(shè)計(jì)處理的是H264格式的源,函數(shù)中應(yīng)當(dāng)加入H264VideoStreamFramer::createNew()語(yǔ)句。
B、對(duì)于createNewRTPSink函數(shù),同理,函數(shù)中應(yīng)當(dāng)加入H264VideoRTPSink::createNew()語(yǔ)句。
C、setSDPLinesFromRTPSink取得Subsession的sdp并保存到fSDPLines,這個(gè)函數(shù)重點(diǎn)是調(diào)用getAuxSDPLine,因此需要重構(gòu)getAuxSDPLine函數(shù)。getAuxSDPLine函數(shù)所調(diào)用的chkForAuxSDPLine也需要重載。對(duì)于H.264文件,是不能從rtpSink中取得PPS/SPS的,所以必須調(diào)用startPlaying函數(shù)對(duì)視頻流播放一下才行,播放之后又會(huì)關(guān)閉,這點(diǎn)在建立連接的時(shí)候可以用打印函數(shù)調(diào)用流程以便了解的更加清楚。在下面的偽代碼中,可以看到之后又調(diào)用了chkForAuxSDPLine這個(gè)函數(shù),這是為了保證在函數(shù)退出前能正確取得AuxSDP,所以在chkForAuxSDPLine函數(shù)中需要循環(huán)檢查是否取得AuxSDP。偽代碼如下所示。
rtpsink = sink;
rtpsink->startPlaying(*source, 0, 0);// 開(kāi)始播放
chkForAuxSDPLine(this); // 循環(huán)檢查
sdp_line = strdup(rtpsink->auxSDPLine());//保存
mp_dummy_rtpsink->stopPlaying(); // 停止播放
return mp_sdp_line; // 返回值
2.2.2 構(gòu)建WebcamFrameSource類
WebcamFrameSource屬于一個(gè)source類,也就是一個(gè)能夠提供視頻源的類。流媒體開(kāi)發(fā)大都具有相似的特征,Live555中也繼承了source和sink的精神,簡(jiǎn)而言之,Source就是產(chǎn)生數(shù)據(jù)的對(duì)象,而Sink節(jié)點(diǎn)是數(shù)據(jù)最終流向的對(duì)象,Sink的數(shù)據(jù)必須通過(guò)source讀取。Live555工程中雖然已經(jīng)實(shí)現(xiàn)好眾多的source,但是并沒(méi)有能夠?qū)崿F(xiàn)直播攝像頭過(guò)來(lái)的數(shù)據(jù)的功能,因此,二次開(kāi)發(fā)的主要任務(wù)之一便是構(gòu)建新的source,該source應(yīng)該具有將H264的打包數(shù)據(jù)存放在內(nèi)存中,并且能夠傳送給H264VideoRTPSink。本設(shè)計(jì)中,基于FramedSource構(gòu)建WebcamFrameSource類。
對(duì)于WebcamFrameSource類,主要開(kāi)發(fā)工作是在其構(gòu)造函數(shù)中配置好V4L2采集攝像頭數(shù)據(jù),x264編碼優(yōu)化設(shè)置,作為一個(gè)source類,每次從該source中取數(shù)據(jù)時(shí),都會(huì)調(diào)用doGetNextFrame函數(shù),該函數(shù)作為FramedSource類中的一個(gè)虛函數(shù),可以在新構(gòu)造的WebcamFrameSource類中進(jìn)行重載。對(duì)V4L2設(shè)備的初始化流程如圖5所示。
圖5 V4L2初始化設(shè)置
X264視頻編碼初始配置偽代碼如下所示。
ctx->force_keyframe = 0; // 不使用強(qiáng)制關(guān)鍵幀
x264_param_default_preset(ctx->param, fast, zerolatency); //預(yù)設(shè)為零延遲
ctx->param.b_repeat_headers = 1;
ctx->param.b_cabac = 1; //支持cabac
ctx->param.i_threads = 1; //緩沖區(qū)數(shù)據(jù)被取完后任使用不會(huì)出現(xiàn)死鎖
ctx->param.i_fps_num = 30; // 幀率為30
ctx->param.rc.i_bitrate = 150; // 默認(rèn)碼率
ctx->x264 = x264_encoder_open(ctx->param); // 使用設(shè)置好的參數(shù)打開(kāi)編碼
x264_picture_init(ctx->picture); // 輸出圖像初始化
另外,也需要對(duì)libswscale的使用做一定的初始化,在本設(shè)計(jì)中,libswscale主要用來(lái)轉(zhuǎn)換V4L2輸出的yuv422格式數(shù)據(jù)為YUV420,其中主要是配置圖像高度,寬度,輸入輸出格式,涉及到的函數(shù)主要是sws_getContext和avpicture_alloc,在此不再做詳細(xì)敘述。
在從WebcamFrameSource這個(gè)流媒體源中取數(shù)據(jù)時(shí),都會(huì)調(diào)用doGetNextFrame這個(gè)函數(shù),此函數(shù)是FramedSource類中定義的虛函數(shù),因此需要在構(gòu)建WebcamFrameSource類時(shí)進(jìn)行重載。從流媒體服務(wù)器發(fā)出一幀數(shù)據(jù)的流程如圖6所示。
圖6 數(shù)據(jù)傳輸流程圖
按照流程圖構(gòu)造新的流媒體源,并且根據(jù)幀率設(shè)置讀取兩幀的間隔延遲時(shí)間,能夠滿足實(shí)時(shí)性要求。
3 系統(tǒng)實(shí)現(xiàn)
3.1 軟硬件環(huán)境
服務(wù)器硬件環(huán)境為T(mén)I的DM3730處理器,256MB運(yùn)行內(nèi)存,該處理器基于Cortex-A8架構(gòu),主頻為1GHz,并采用比較通用的環(huán)宇飛揚(yáng)V8的USB攝像頭。軟件方面,基于Linux 2.3.32內(nèi)核,并裝載Angstrom文件系統(tǒng)。
客戶端為普通PC,運(yùn)行Ubuntu 10.04,客戶端連接程序使用FFmpeg項(xiàng)目中的ffplay,該播放器能夠很好的支持RTSP點(diǎn)播。
3.2 移植要點(diǎn)
本設(shè)計(jì)中需要編譯的庫(kù)文件為x264,以及l(fā)ibswscale,V4L2已經(jīng)包含在Linux內(nèi)核驅(qū)動(dòng)中,x264可以下載到單獨(dú)的工程,而libswscale包含在FFmpeg工程中。
對(duì)于x264工程的編譯,本設(shè)計(jì)直接從x264官網(wǎng)下載版本號(hào)為20140104-2245的源碼,使用如下命令配置。
./configure --prefix=/home/x264 --enable-shared --enable-static --enable-debug --cross-prefix=arm-none-linux-gnueabi- --host=arm-linux
命令的含義大致為安裝目錄為/home/x264,同時(shí)編譯靜態(tài)和動(dòng)態(tài)庫(kù)文件,使能調(diào)試,并設(shè)置好交差編譯工具鏈。配置好后使用make;make install即可得到編譯好的目標(biāo)板文件。然后將x264.h和x264_config.h復(fù)制到目標(biāo)板的/usr/include目錄,庫(kù)文件復(fù)制到/usr/lib目錄。
要獲取libswscale,需要先編譯FFmpeg,本設(shè)計(jì)采用的FFmpeg版本號(hào)為0.8.15,配置FFmpeg的命令如下所示。
./configure --prefix=/home/FFmpeginstall/ --enable-shared --target-os=linux --enable-cross-compile --cross-prefix=arm-none-linux-gnueabi- --arch=arm
配置好之后,使用make;make install命令,將安裝目錄下include中l(wèi)ibswscale目錄復(fù)制到目標(biāo)板的/usr/include目錄,lib目錄中的libswscale.a和libswscale.so復(fù)制到/usr/lib目錄。
然后再使用交叉編譯工具利用剛才編譯好的這些庫(kù)文件,編譯目標(biāo)板可執(zhí)行的流媒體服務(wù)器主程序,編譯好之后將可執(zhí)行程序拷貝到目標(biāo)板的/opt目錄下。
3.3 優(yōu)化
由于運(yùn)行環(huán)境為嵌入式系統(tǒng),資源有限,而且又要保證流播放的實(shí)時(shí)性,因此需要做一些調(diào)整。本設(shè)計(jì)中程序運(yùn)行負(fù)擔(dān)主要集中在編碼部分,為了減輕編碼負(fù)擔(dān),使用libswscale將分辨率為640x480的視頻流轉(zhuǎn)換為320x240大小的視頻流。在視頻傳輸過(guò)程中,降低幀率,最終確定為15幀的幀率。為了保證實(shí)時(shí)性,對(duì)x264編碼參數(shù)預(yù)設(shè)為快速,零延遲。
3.4 系統(tǒng)測(cè)試運(yùn)行
當(dāng)服務(wù)器開(kāi)啟之后,客戶端PC通過(guò)以太網(wǎng)與目標(biāo)板連接,設(shè)置客戶端PC網(wǎng)卡地址,確保在同一IP網(wǎng)段上面,在客戶端給ffplay傳入RTSP://192.168.71.128:9554/webcam參數(shù)。
結(jié)語(yǔ)
在當(dāng)下RTSP技術(shù)被普遍應(yīng)用的背景下,本文構(gòu)建了一個(gè)結(jié)合實(shí)時(shí)視頻采集、編碼和嵌入式技術(shù)的RTSP流媒體服務(wù)器,并采用目前常用的支持RTSP技術(shù)的FFplayer作為客戶端播放器,實(shí)現(xiàn)了嵌入式視頻監(jiān)控系統(tǒng)的設(shè)計(jì),整個(gè)系統(tǒng)成本低廉,穩(wěn)定可靠,并且負(fù)荷方面基本能滿足中小型應(yīng)用的要求,具備一定的參考價(jià)值。
評(píng)論