吳常清
摘要:分析了基于IP Camera的ispy網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng),該系統(tǒng)掃描出局域網(wǎng)中用戶(hù)設(shè)定的IP和端口號(hào)的IP Camera,利用AForge. net提供的API與IP Camera之間建立連接,然后ispy將IP Camera收集來(lái)的圖片發(fā)送www.ispyconnect.com,注冊(cè)用戶(hù)可以使用PC、IPad、手機(jī)等終端設(shè)備上的瀏覽器觀看到IP Camera傳送過(guò)來(lái)的視頻。ispy還提供了自動(dòng)報(bào)警功能,當(dāng)IP Camera通過(guò)相應(yīng)算法監(jiān)測(cè)到異常信息時(shí),會(huì)通過(guò)sms、email等方式將異常信息發(fā)送給客戶(hù)。
關(guān)鍵詞:ispy;IP Camera;視頻監(jiān)控
中圖分類(lèi)號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2012)21-5227-04
1 ispy簡(jiǎn)介
視頻監(jiān)控在我們?nèi)粘I钪衅鸬搅酥匾饔?。它廣泛應(yīng)用于機(jī)器設(shè)備看護(hù)、家庭保護(hù)、老人監(jiān)護(hù)、寵物照顧等等。網(wǎng)絡(luò)攝像機(jī)(IP Camera)的迅速發(fā)展也使得視頻監(jiān)控變得更加方便與簡(jiǎn)捷。IP Camera除了具備一般的傳統(tǒng)攝像機(jī)的所有圖像捕捉功能外,機(jī)內(nèi)還內(nèi)置了數(shù)字化壓縮控制器和基于WEB的操作系統(tǒng),使得視頻數(shù)據(jù)經(jīng)過(guò)壓縮加密后,通過(guò)局域網(wǎng),internet或無(wú)線(xiàn)網(wǎng)絡(luò)送至終端用戶(hù)。IP Camera可以直接接入到TCP/IP的數(shù)字化網(wǎng)絡(luò)中,因此這種系統(tǒng)主要的功能就是聯(lián)網(wǎng)上面,通過(guò)互聯(lián)網(wǎng)或者局域網(wǎng)進(jìn)行視頻和音頻的傳輸。ispy是一種C#編寫(xiě)的開(kāi)源視頻監(jiān)控軟件,它將局域網(wǎng)中的網(wǎng)絡(luò)攝像機(jī)的視頻信息收集起來(lái),進(jìn)行集中式管理。用戶(hù)可以用ispy對(duì)視頻進(jìn)行管理,它可以將視頻流發(fā)送到ispy的官方網(wǎng)站,注冊(cè)用戶(hù)登錄后可以在個(gè)人電腦或手機(jī)上觀看到視頻信息,可以播放原來(lái)錄制的視頻,也可以遠(yuǎn)程控制云臺(tái),它使人們做到了真正的遠(yuǎn)程監(jiān)控。ispy不僅可以用來(lái)進(jìn)行監(jiān)控,它還具有自動(dòng)報(bào)警的功能,一旦監(jiān)測(cè)到危險(xiǎn)時(shí)就會(huì)將危險(xiǎn)信息發(fā)送到用戶(hù)的郵件或通過(guò)sms發(fā)送。
1 ispy中利用的技術(shù)簡(jiǎn)介
1)ispy利用了AForge.net這個(gè)框架。AForge.net[1]是一個(gè)專(zhuān)門(mén)為開(kāi)發(fā)者和研究者基于C#框架設(shè)計(jì)的,這個(gè)框架提供了不同的類(lèi)庫(kù)和關(guān)于類(lèi)庫(kù)的資源,還有很多應(yīng)用程序例子,包括計(jì)算機(jī)視覺(jué)與人工智能,圖像處理,神經(jīng)網(wǎng)絡(luò),遺傳算法,機(jī)器學(xué)習(xí),機(jī)器人等領(lǐng)域。
2)Web Service[2]也叫XML Web Service WebService是一種可以接收從Internet或者Intranet上的其它系統(tǒng)中傳遞過(guò)來(lái)的請(qǐng)求,輕量級(jí)的獨(dú)立的通訊技術(shù)。
Web Service的主要目標(biāo)是跨平臺(tái)的可互操作性。為了實(shí)現(xiàn)這一目標(biāo),Web Service完全基于XML(可擴(kuò)展標(biāo)記語(yǔ)言)、XSD(XML Schema)等獨(dú)立于平臺(tái)、獨(dú)立于軟件供應(yīng)商的標(biāo)準(zhǔn),是創(chuàng)建可互操作的、分布式應(yīng)用程序的新平臺(tái)。因此使用Web Service有許多優(yōu)點(diǎn),其中最大的優(yōu)點(diǎn)是跨防火墻的通信。
如果應(yīng)用程序有成千上萬(wàn)的用戶(hù),而且分布在世界各地,那么客戶(hù)端和服務(wù)器之間的通信將是一個(gè)棘手的問(wèn)題。因?yàn)榭蛻?hù)端和服務(wù)器之間通常會(huì)有防火墻或者代理服務(wù)器。傳統(tǒng)的做法是,選擇用瀏覽器作為客戶(hù)端,寫(xiě)下一大堆ASP頁(yè)面,把應(yīng)用程序的中間層暴露給最終用戶(hù)。這樣做的結(jié)果是開(kāi)發(fā)難度大,程序很難維護(hù)。要是客戶(hù)端代碼不再如此依賴(lài)于HTML表單,客戶(hù)端的編程就簡(jiǎn)單多了。如果中間層組件換成Web Service的話(huà),就可以從用戶(hù)界面直接調(diào)用中間層組件,從而省掉建立ASP頁(yè)面的那一步。要調(diào)用Web Service,可以直接使用Microsoft SOAP Toolkit或.net這樣的SOAP客戶(hù)端,也可以使用自己開(kāi)發(fā)的SOAP客戶(hù)端,然后把它和應(yīng)用程序連接起來(lái)。不僅縮短了開(kāi)發(fā)周期,還減少了代碼復(fù)雜度,并能夠增強(qiáng)應(yīng)用程序的可維護(hù)性。同時(shí),應(yīng)用程序也不再需要在每次調(diào)用中間層組件時(shí),都跳轉(zhuǎn)到相應(yīng)的"結(jié)果頁(yè)"。
3)利用瀏覽器來(lái)訪(fǎng)問(wèn)IP Camera。需要解決的問(wèn)題是NAT穿透[3]。解決的方法是,利用一個(gè)具有公網(wǎng)IP的計(jì)算機(jī),將它作為中介。在ispy上設(shè)置局域網(wǎng)中的每臺(tái)IP Camera的IP地址和端口。位于不同私網(wǎng)的兩臺(tái)主機(jī),在與另一臺(tái)主機(jī)通信時(shí),通過(guò)NAT的地址轉(zhuǎn)換,將私網(wǎng)地址和端口映射為公網(wǎng)地址和端口,利用此地址相互通信。
4)UPnP是各種各樣的智能設(shè)備、無(wú)線(xiàn)設(shè)備和個(gè)人電腦等實(shí)現(xiàn)遍布全球的對(duì)等網(wǎng)絡(luò)連接(P2P)的結(jié)構(gòu)。UPnP是一種分布式的,開(kāi)放的網(wǎng)絡(luò)架構(gòu)。UPnP是獨(dú)立的媒介。在任何操作系統(tǒng)中,利用任何編程語(yǔ)言都可以使用UPnP設(shè)備。
NAT穿越技術(shù)[3]允許網(wǎng)絡(luò)應(yīng)用程序?qū)λ鼈兪欠裎挥谝粋€(gè)具有UPnP能力的NAT設(shè)備之后進(jìn)行檢測(cè)。然后,這些程序?qū)@得共享的全球可路由IP地址,并且配置端口映射以將來(lái)自NAT外部端口的數(shù)據(jù)包轉(zhuǎn)發(fā)到應(yīng)用程序使用的內(nèi)部端口上--所有這一切都是自動(dòng)完成的,用戶(hù)無(wú)需手動(dòng)映射端口或者進(jìn)行其它工作。NAT穿越技術(shù)允許網(wǎng)絡(luò)設(shè)備或者點(diǎn)對(duì)點(diǎn)應(yīng)用程序通過(guò)動(dòng)態(tài)開(kāi)啟和閉合與外部服務(wù)之間的通信端口穿過(guò)NAT網(wǎng)關(guān)與外界通信。
5)P2P是英文Peer-to-Peer(對(duì)等)的簡(jiǎn)稱(chēng),又被稱(chēng)為“點(diǎn)對(duì)點(diǎn)”,P2P結(jié)構(gòu)如下圖1所示?!皩?duì)等”技術(shù),是一種網(wǎng)絡(luò)新技術(shù),依賴(lài)網(wǎng)絡(luò)中參與者的計(jì)算能力和帶寬,而不是把依賴(lài)都聚集在較少的幾臺(tái)服務(wù)器上。
圖1
簡(jiǎn)單的說(shuō),P2P直接將人們聯(lián)系起來(lái),讓人們通過(guò)互聯(lián)網(wǎng)直接交互。P2P使得網(wǎng)絡(luò)上的溝通變得容易、更直接共享和交互,真正地消除中間商。P2P就是人可以直接連接到其他用戶(hù)的計(jì)算機(jī)、交換文件,而不是像過(guò)去那樣連接到服務(wù)器去瀏覽與下載。P2P另一個(gè)重要特點(diǎn)是改變互聯(lián)網(wǎng)現(xiàn)在的以大網(wǎng)站為中心的狀態(tài)、重返"非中心化",并把權(quán)力交還給用戶(hù)。
ispy中應(yīng)用到了P2P技術(shù)[4],當(dāng)用戶(hù)從遠(yuǎn)端的瀏覽器對(duì)局域網(wǎng)中的攝像頭進(jìn)行訪(fǎng)問(wèn)時(shí),ispy官網(wǎng)的服務(wù)器會(huì)和作為一個(gè)Server,而遠(yuǎn)端的瀏覽器所用客戶(hù)端作為一個(gè)peer,網(wǎng)絡(luò)攝像頭作為一個(gè)peer,它們之間通過(guò)P2P技術(shù)進(jìn)行通信。
2 ispy的應(yīng)用
2.1ispy的網(wǎng)絡(luò)結(jié)構(gòu)
如圖2所示。
圖2
2.2網(wǎng)絡(luò)攝像機(jī)的監(jiān)測(cè)
由于每個(gè)IPCamera內(nèi)置有操作系統(tǒng)和WEB服務(wù)器,所以我們可以把它設(shè)想成一臺(tái)小型電腦。ispy是通過(guò)命令arp–a的方法來(lái)獲取所在局域網(wǎng)內(nèi)的所有ip camera的IP地址和所開(kāi)放的端口號(hào)。這部分的代碼在FindCamera.cs,以下代碼是將局域網(wǎng)中所有的網(wǎng)絡(luò)攝像機(jī)都掃描出來(lái)。
foreach (string s1 in nb.GetNetworkComputers())
{
var ipEntry = Dns.GetHostEntry(s1.Trim(\));
var addr=ipEntry.AddressList.Where(p=>p.AddressFamily==AddressFamily.InterNetwork);
foreach (var t in addr)
{
DnsEntries.Add(t.ToString().Trim());
}
}
2.3視頻的捕獲模塊與存儲(chǔ)
很多嵌入式WEB服務(wù)器提供公共網(wǎng)關(guān)接口(cgi),它能使WEB的客戶(hù)端和服務(wù)器之間進(jìn)行交互操作,完成一些如遠(yuǎn)程監(jiān)控、數(shù)據(jù)庫(kù)查詢(xún)、參數(shù)更新等功能。CGI有3種可以從HTTP服務(wù)器獲取用戶(hù)輸入的數(shù)據(jù);通過(guò)環(huán)境變量(GET);通過(guò)命令行參數(shù)方式;通過(guò)CGI程序的標(biāo)準(zhǔn)輸入方式(POST)。當(dāng)從服務(wù)器上獲得數(shù)據(jù)并且不改變服務(wù)器端原有數(shù)據(jù)、且數(shù)據(jù)量較小時(shí),可以采用GET方式,GET方式常被用于獲取靜態(tài)文檔。由于不同IP Camera的CGI是不同的,所以ispy將不同IP Camera的CGI存放到一個(gè)Sources.xml文件中,以達(dá)到可以連接多種IP Camera的目的。
視頻的捕獲是利用AForge.net中提供的DirectShow視頻開(kāi)發(fā)技術(shù)。代碼在CameraVideo.cs中。以下是獲取本地USB攝像頭的代碼,主要是利用DirectShow提供的VideoCaptureDevice。
string moniker = Camobject.settings.videosourcestring;
var videoSource = new VideoCaptureDevice(moniker);
string[] wh = Camobject.resolution.Split(x);
videoSource.DesiredFrameSize=newSize(Convert.ToInt32(wh[0]),Convert.ToInt32(wh[1]));
videoSource.DesiredFrameRate = Camobject.settings.framerate;
OpenVideoSource(videoSource, true);
break;
獲取到攝像頭后,會(huì)捕獲攝像頭傳來(lái)的每一幅圖片,并將圖片封裝成幀,然后再以一定的壓縮算法將圖片轉(zhuǎn)成視頻流。如下代碼取于WindowCamera.cs中的BmpToBytes_MemStream方法,它是將圖片轉(zhuǎn)換成視頻流。
var ms = new MemoryStream();
// Save to memory using the Jpeg format
bmp.Save(ms, MainForm.Encoder, MainForm.EncoderParams);
// read to end
byte[] bmpBytes = ms.GetBuffer();
bmp.Dispose();
bmp = null;
ms.Close();
return bmpBytes;
每天錄制的視頻會(huì)存放在一個(gè)隨機(jī)命名的文件下。
2.4在外部網(wǎng)絡(luò)中利用瀏覽器訪(fǎng)問(wèn)
在LocalServer.cs中有一個(gè)_myListener進(jìn)程,它在指定的IP地址和端口上偵聽(tīng)是否有傳入的連接嘗試,它將IP Camera傳送過(guò)來(lái)的一幀幀圖片封裝成數(shù)據(jù)流。在ispy與網(wǎng)絡(luò)攝像機(jī)之間進(jìn)行數(shù)據(jù)交換時(shí),ispy作為服務(wù)器,攝像機(jī)作為客戶(hù)端。而當(dāng)在ispy與瀏覽器端建立了連接時(shí),ispy是作為客戶(hù)端與ispy官網(wǎng)作為服務(wù)器進(jìn)行交換數(shù)據(jù)的。在LocalServer.cs的StartListen
方法中String sRequestedFile;
String sErrorMessage; String sLocalDir; String sDirName;
ParseRequest(sMyWebServerRoot, sBuffer, out sRequest, out sRequestedFile, out sErrorMessage, out sLocalDir, out sDirName, out sPhysicalFilePath, out sHttpVersion,
out sFileName, out sMimeType, out bServe, out bHasAuth, ref mySocket);
if (!bServe)
{
resp = "Denied(Access this server through ispyconnect.com)";
SendHeader(sHttpVersion, "text/html", resp.Length, " 200 OK", 0, ref mySocket);
SendToBrowser(resp, mySocket);
goto Finish;
}
2.4.1處理瀏覽器發(fā)出的云臺(tái)命令
當(dāng)用戶(hù)用瀏覽器對(duì)遠(yuǎn)程的攝像機(jī)進(jìn)行訪(fǎng)問(wèn)時(shí),還可以使用命令的方式對(duì)攝像機(jī)的云臺(tái)進(jìn)行控制。主要代碼在LocalServer.cs的ProcessCommandInternal中
case "ptz":
if (value != "")
cw.CalibrateCount = 0;
cw.Calibrating = true;
if(value.StartsWith("ispydir_"))cw.PTZ.SendPTZCommand((
Enums.PtzCommand)Convert.ToInt32(value.Replace("ispydir_", "")));
else
cw.PTZ.SendPTZCommand(value,true);
}
2.4.2運(yùn)動(dòng)監(jiān)測(cè)算法
Ispyconnect中的運(yùn)動(dòng)監(jiān)測(cè)算法都是調(diào)用AForge.net中的類(lèi),程序員不需要知道具體算法的如何實(shí)現(xiàn)的,只要知道算法的功能就可以。如以下是比較前后兩幀之間差異的算法
if (_camera.MotionDetector.MotionDetectionAlgorithm isCustomFrameDifferenceDetector)
{ ((CustomFrameDifferenceDetector)_camera.MotionDetector.MotionDetectionAlgorithm).SetBackgroundFrame(_camera.LastFrame);
}
3結(jié)束語(yǔ)
該文分析了基于IP Camera的ispy在視頻監(jiān)控中的實(shí)現(xiàn)。由于IP Camera中采用了嵌入式系統(tǒng)技術(shù),支持多種傳輸協(xié)議,綜合考慮成本和性能等方面。ispy適合于家庭、企業(yè)、政府等視頻監(jiān)控的實(shí)現(xiàn)。
參考文獻(xiàn):
[1]龔成瑩,何輝.基于AForge.NET的車(chē)輛運(yùn)動(dòng)視頻檢測(cè)方法[J].電腦知識(shí)與技術(shù),2011(1):187-188,196.
[2] webservice百度百科[EB/OL].http://baike.baidu.com/view/837392.htm.
[3]歐陽(yáng)軍林,李中凱,李章兵.大學(xué)生宿舍視頻監(jiān)控報(bào)警系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)[J].微計(jì)算機(jī)應(yīng)用,2011(1):60-67
[4] ispyconnect官方網(wǎng)站[EB/OL].http://www.ispyconnect.com.