李聞斌
(桂林電子科技大學(xué)計(jì)算機(jī)與信息安全學(xué)院,廣西桂林541004)
隨著經(jīng)濟(jì)社會(huì)的發(fā)展,各地都在大力推廣平安城市、智慧城市,而大量視頻監(jiān)控系統(tǒng)建設(shè)起來(lái)后卻面臨著一個(gè)重要問(wèn)題:如何共享海量的歷史視頻。由于各個(gè)視頻廠家的歷史視頻格式都不一樣,都必須得用他們自己的解碼庫(kù)來(lái)解碼播放,這就導(dǎo)致要播放如此多種類的視頻就得準(zhǔn)備幾個(gè)甚至十幾個(gè)不同的播放器,同時(shí)還不能用視頻編輯工具對(duì)它們進(jìn)行編輯。本文討論的流媒體服務(wù),通過(guò)RTSP地址接收攝像頭的音視頻流,再以標(biāo)準(zhǔn)RTSP轉(zhuǎn)發(fā)實(shí)時(shí)音視頻,對(duì)音視頻不做任何處理;同時(shí)歷史視頻即可點(diǎn)播,也可時(shí)間軸(時(shí)間段)播放,還可下載保存為標(biāo)準(zhǔn)MP4格式,可用普通播放器播放,如VLC、暴風(fēng)影音。
IOCP全稱I/O Completion Port,中文譯為I/O完成端口。IOCP是一個(gè)異步I/O的API,它可以高效地將I/O事件通知給應(yīng)用程序,適用于能控制并發(fā)執(zhí)行的高負(fù)載服務(wù)器的一個(gè)技術(shù),就是用于高效處理很多很多的客戶端進(jìn)行數(shù)據(jù)交換的一個(gè)模型[1]。
本文實(shí)現(xiàn)的流媒體服務(wù)應(yīng)用于windows平臺(tái),采用IOCP模型可以實(shí)現(xiàn)多線程快速處理多客戶端的各種請(qǐng)求,有效避免因程序造成的等待。
軟件開(kāi)發(fā)工具包(外語(yǔ)首字母縮寫:SDK、外語(yǔ)全稱:Software Development Kit)一般都是一些軟件工程師為特定的軟件包、軟件框架、硬件平臺(tái)、操作系統(tǒng)等建立應(yīng)用軟件時(shí)的開(kāi)發(fā)工具的集合[2]。
每個(gè)視頻設(shè)備生產(chǎn)廠家為獲取音視頻流、控制云臺(tái)、亮度、色度等以及存儲(chǔ)歷史視頻文件及播放功能等等,都有相應(yīng)的SDK開(kāi)發(fā)包。由于沒(méi)有國(guó)家標(biāo)準(zhǔn),每個(gè)SDK對(duì)實(shí)時(shí)流和歷史視頻的定義和格式都不一樣,形成了各種技術(shù)壁壘,無(wú)形中阻礙了視頻的共享,特別是歷史視頻的共享。
實(shí)時(shí)流協(xié)議(RTSP)是應(yīng)用級(jí)協(xié)議,控制實(shí)時(shí)數(shù)據(jù)的發(fā)送。該協(xié)議用于C/S模型,是一個(gè)基于文本的協(xié)議,用于在客戶端和服務(wù)器端建立和協(xié)商實(shí)時(shí)流會(huì)話。RTSP在體系結(jié)構(gòu)上位于RTP和RTCP之上,它使用TCP或UDP完成數(shù)據(jù)傳輸。
經(jīng)研究發(fā)現(xiàn)每個(gè)視頻設(shè)備生產(chǎn)廠家的視頻監(jiān)控設(shè)備(攝像頭)都可以通過(guò)RTSP地址直接獲得音視頻流,RTSP地址如 :rtsp://user:pwd@%IP:554/h264/ch1/sub/av_stream 或 rtsp://user:pwd@%IP:554/stream1,只要獲得用戶名和密碼就可以直接訪問(wèn)設(shè)備獲取實(shí)時(shí)流,極大的方便后續(xù)的開(kāi)發(fā),如:存儲(chǔ)歷史視頻、視頻播放器。
流媒體服務(wù)通過(guò)跨網(wǎng)段以及跨平臺(tái)轉(zhuǎn)發(fā)視頻流服務(wù)提高了視頻聯(lián)網(wǎng)平臺(tái)視頻流管理以及傳輸?shù)姆€(wěn)定性、高效性和合理性,為用戶請(qǐng)求實(shí)時(shí)和歷史視頻提供了快速的響應(yīng)速度以及詳細(xì)的反饋信息[4-5]。
由于流媒體服務(wù)主要功能是視頻轉(zhuǎn)發(fā)[6]和視頻回放,也就是實(shí)時(shí)視頻數(shù)據(jù)流轉(zhuǎn)發(fā)和歷史視頻數(shù)據(jù)流轉(zhuǎn)發(fā)。實(shí)時(shí)視頻數(shù)據(jù)流通過(guò)RTSP地址直接從視頻監(jiān)控設(shè)備(攝像頭)獲得,歷史視頻數(shù)據(jù)流則通過(guò)讀取存儲(chǔ)在存儲(chǔ)服務(wù)器上的歷史視頻文件獲得。
歷史視頻數(shù)據(jù)流又分為單視頻數(shù)據(jù)流和時(shí)間軸視頻數(shù)據(jù)流。單視頻數(shù)據(jù)流很好理解就是讀取存儲(chǔ)服務(wù)器上的單個(gè)歷史視頻文件形成視頻數(shù)據(jù)流進(jìn)行傳輸,時(shí)間軸視頻數(shù)據(jù)流則要求讀取多個(gè)歷史視頻文件的數(shù)據(jù)媒體信息將它們整合形成一個(gè)視頻數(shù)據(jù)流信息來(lái)進(jìn)行傳輸。這是由于高清視頻文件的存儲(chǔ)時(shí)間一般在10分鐘左右,如果要查看20分鐘的視頻,普通操作(單視頻播放)是播放完一個(gè)再選擇下一個(gè)播放,很不方便,通過(guò)時(shí)間軸的方式播放視頻只需要用戶選擇好開(kāi)始時(shí)間和結(jié)束時(shí)間即可觀看此時(shí)間段內(nèi)的視頻,特別是案件發(fā)生時(shí)間持續(xù)兩個(gè)視頻文件,可以省去在兩個(gè)歷史視頻文件間切換的時(shí)間,進(jìn)而流暢的觀看整個(gè)過(guò)程。
此外,流媒體服務(wù)還提供下載功能。下載也分為單視頻下載和時(shí)間軸視頻下載。
由于實(shí)時(shí)視頻數(shù)據(jù)流轉(zhuǎn)發(fā)和歷史視頻數(shù)據(jù)流轉(zhuǎn)發(fā)請(qǐng)求,以及歷史視頻的下載都涉及到RTSP協(xié)議的應(yīng)用,本文著重講述RTSP客戶端和服務(wù)端的實(shí)現(xiàn)及在流媒體服務(wù)中的應(yīng)用。
實(shí)時(shí)視頻數(shù)據(jù)流通過(guò)RTSP地址直接從視頻監(jiān)控設(shè)備(攝像頭)獲得,此時(shí)流媒體服務(wù)作為RTSP客戶端,通過(guò)RTSP協(xié)議請(qǐng)求視頻監(jiān)控設(shè)備上的服務(wù)程序來(lái)獲得實(shí)時(shí)視頻數(shù)據(jù)流。利用C++語(yǔ)言實(shí)現(xiàn)RTSP協(xié)議的Client:class MRTSPClient。
類MRTSPClient完成連接設(shè)備服務(wù)、請(qǐng)求options、請(qǐng)求describe、解析SDP、請(qǐng)求setup、請(qǐng)求play和請(qǐng)求teardown。
主要函數(shù)包括:
bool open Url();//連接設(shè)備服務(wù)
int request_options();//請(qǐng)求 options
int request_describe();//請(qǐng)求describe
int parse SDP();//解析SDP
int request_setup();//請(qǐng)求setup
int request_play();//請(qǐng)求 play
int request_teardown();//請(qǐng)求 teardown
在轉(zhuǎn)發(fā)實(shí)時(shí)視頻數(shù)據(jù)流、歷史視頻數(shù)據(jù)流和歷史視頻文件下載時(shí),流媒體服務(wù)作為RTSP服務(wù)端,接收客戶端的連接和請(qǐng)求。利用C++語(yǔ)言實(shí)現(xiàn)IOCP模型和解析RTSP協(xié)議請(qǐng)求函數(shù)。
類CRTSPSocket實(shí)現(xiàn)IOCP模型,主要函數(shù)包括:
bool_InitializeIOCP();//初始化IOCP
bool_InitializeListenSocket();//初始化Socket
static DWORD WINAPI_WorkerThread();//為IOCP請(qǐng)求服務(wù)的工作者線程
static DWORD WINAPI_ClientHandle();//管理接入客戶的線程
bool_DoRecv();//接收客戶端RTSP協(xié)議數(shù)據(jù)并交由ParseMessage函數(shù)處理
RTSP協(xié)議解析函數(shù)包括:
void ParseMessage();//分配處理
int handleCmd_Option();//解析option請(qǐng)求
int handleCmd_Describe();//解析describe請(qǐng)求
int handleCmd_Setup();//解析setup請(qǐng)求
int handleCmd_Play();//解析play請(qǐng)求
int handleCmd_Teardown();//解析teardown請(qǐng)求
在處理時(shí)間軸視頻流時(shí)需要讀取多個(gè)歷史視頻文件的媒體信息并整合形成一個(gè)視頻流,使用到的函數(shù)openFile(list
具體的歷史視頻文件的媒體信息整合算法如下:
本文提出的基于IOCP和RTSP的流媒體服務(wù)主要是面向視頻監(jiān)控系統(tǒng),通過(guò)RTSP地址直接從視頻監(jiān)控設(shè)備(攝像頭)獲得實(shí)時(shí)流,此方法成功繞開(kāi)了設(shè)備廠家的SDK,降低了對(duì)設(shè)備廠家SDK的依賴,既可以加速后續(xù)新廠家設(shè)備的加入,也實(shí)現(xiàn)了歷史視頻文件的統(tǒng)一格式,形成標(biāo)準(zhǔn)的MP4文件供查看及播放,在一定程度上實(shí)現(xiàn)了兼容性的視頻監(jiān)控系統(tǒng),避免了信息孤島的形成,同時(shí)兼具可擴(kuò)展性、可移植性。