否則,返回步驟101 ;
[0058]步驟104:設(shè)置視頻采集的參數(shù),將videodev的對(duì)象設(shè)置為全局變量,作為兩個(gè)線程的共享資源;
[0059]步驟105:為服務(wù)器端創(chuàng)建兩個(gè)并行的線程,分別為:視頻采集線程和服務(wù)線程。視頻采集線程主要是進(jìn)行視頻采集、視頻壓縮的過(guò)程。網(wǎng)絡(luò)服務(wù)端服務(wù)線程主要進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)幀發(fā)送和控制命令幀接收的功能。
[0060]視頻采集線程創(chuàng)建完成后,判斷是否退出視頻采集線程,若退出則進(jìn)入步驟106,否則循環(huán)運(yùn)行視頻采集線程;服務(wù)線程創(chuàng)建前,先打開(kāi)socket,將本地IP綁定端口號(hào),實(shí)時(shí)監(jiān)聽(tīng)是否有PC客戶(hù)端需要進(jìn)行網(wǎng)絡(luò)傳輸,若有PC客戶(hù)端需要進(jìn)行網(wǎng)絡(luò)傳輸,則建立網(wǎng)絡(luò)連接;服務(wù)線程創(chuàng)建完成后,判斷是否退出服務(wù)線程,若退出則進(jìn)入步驟106,否則循環(huán)運(yùn)行服務(wù)線程;
[0061]如圖4所示,視頻采集線程的創(chuàng)建步驟如下:
[0062]步驟a)捕獲視頻幀數(shù)據(jù),判斷當(dāng)前網(wǎng)絡(luò)數(shù)據(jù)幀是否正在發(fā)送,若是,則循環(huán)等待,否則將線程互斥鎖上鎖;
[0063]步驟b)采用XviD編碼器對(duì)視頻幀數(shù)據(jù)進(jìn)行壓縮,并將壓縮后的數(shù)據(jù)放到網(wǎng)絡(luò)數(shù)據(jù)幀中,等待發(fā)送。XviD是編碼效率最高、功能強(qiáng)大,并且是免費(fèi)共享的資源,它直接可以在官方網(wǎng)站上下載,在Linux系統(tǒng)中的輸入如下命令:“make ;make install”,然后就可得到動(dòng)態(tài)鏈接庫(kù)。
[0064]步驟c)將線程互斥鎖解鎖,變換數(shù)據(jù)幀序列,準(zhǔn)備下一次視頻圖像的采集和壓縮。
[0065]如圖5所示,服務(wù)線程的創(chuàng)建步驟如下:
[0066]步驟i)服務(wù)線程接收PC客戶(hù)端發(fā)送來(lái)的控制命令幀,并且根據(jù)控制命令幀設(shè)置米集參數(shù);
[0067]步驟ii)查看線程互斥鎖是否上鎖,若已經(jīng)上鎖,則進(jìn)入循環(huán)等待程序;若沒(méi)有上鎖,則將當(dāng)前序號(hào)的數(shù)據(jù)幀上鎖,防止視頻采集線程將壓縮視頻寫(xiě)入正在發(fā)送的數(shù)據(jù)幀內(nèi),即設(shè)置framelock [frameout] = I,進(jìn)入網(wǎng)絡(luò)數(shù)據(jù)幀發(fā)送流程;
[0068]步驟iii)網(wǎng)絡(luò)數(shù)據(jù)幀發(fā)送后,將當(dāng)前序號(hào)的數(shù)據(jù)幀解鎖,即設(shè)置framelock [frameout] = 0,準(zhǔn)備下一幀的網(wǎng)絡(luò)發(fā)送。
[0069]步驟106:判斷是否有其他線程在工作,若有則進(jìn)入等待,否則直接結(jié)束退出;
[0070]如圖6所示,PC客戶(hù)端設(shè)計(jì)包括如下步驟:
[0071]步驟201:建立socket連接,測(cè)試該連接是否能正確傳輸數(shù)據(jù):若數(shù)據(jù)傳輸正常,就先發(fā)送PC客戶(hù)端的控制命令幀,它是數(shù)據(jù)結(jié)構(gòu)client_t的實(shí)體。
[0072]步驟202:開(kāi)始讀取網(wǎng)絡(luò)數(shù)據(jù)幀,接收壓縮視頻流;
[0073]步驟203:判斷PC客戶(hù)端軟件是否為保存命令,若是保存命令,則將視頻流保存到文件中,執(zhí)行結(jié)束命令,視頻壓縮文件保存到硬盤(pán)后,可以再調(diào)用播放命令,將視頻壓縮文件解碼后用SDL方式播放出來(lái)。若不是保存命令,就進(jìn)入實(shí)時(shí)視頻播放階段,將視頻流放入緩沖區(qū),并進(jìn)入下一步。視頻文件的保存可以用文件操作函數(shù)fVrite實(shí)現(xiàn)。
[0074]MPEG-4 (這里采用XviD方式)編解碼的過(guò)程與靜態(tài)圖像編解碼不一樣,MPEG-4的編碼是基于前后幀之間的相關(guān)性進(jìn)行壓縮的,那么在解碼的時(shí)候同樣需要前后的參考視頻幀,這樣才能正確的實(shí)現(xiàn)MPEG-4解碼。于是,就在視頻解碼之前設(shè)計(jì)了一個(gè)視頻緩沖區(qū)。該緩沖區(qū)由一個(gè)環(huán)形的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),通過(guò)寫(xiě)指針和讀指針?lè)謩e實(shí)現(xiàn)緩沖區(qū)的寫(xiě)入和讀取。
[0075]步驟204:判斷緩沖區(qū)的視頻幀是否可解碼:若是,則采用XviD解碼器進(jìn)行解碼,最后由SDL程序播放實(shí)時(shí)視頻圖像;若否,則返回步驟203繼續(xù)將視頻流放入緩沖區(qū),直至可以解碼,播放實(shí)時(shí)視頻圖像,最后執(zhí)行結(jié)束命令。如果PC客戶(hù)端一直沒(méi)有結(jié)束命令,那么就會(huì)進(jìn)入網(wǎng)絡(luò)接收、解碼、播放的循環(huán)中,從而實(shí)現(xiàn)連續(xù)播放視頻幀的過(guò)程。
[0076]視頻數(shù)據(jù)流的解壓過(guò)程和服務(wù)器端類(lèi)似,采用XviD解碼器實(shí)現(xiàn)。PC客戶(hù)端的程序需要包括XviD.h的文件,具體的靜態(tài)圖像解碼過(guò)程可以參考文件目錄下的XviD_decraw.c文件。實(shí)時(shí)解碼的視頻數(shù)據(jù)流來(lái)自視頻緩沖區(qū),編寫(xiě)解碼過(guò)程需要和緩沖區(qū)的讀寫(xiě)過(guò)程配入口 ο
[0077]本發(fā)明視頻編解碼采用XviD編解碼器提供的函數(shù)接口實(shí)現(xiàn)。參考xvid_encraw.c程序,該程序在XviD編碼函數(shù)接口的基礎(chǔ)上編寫(xiě)了三個(gè)函數(shù),分別表示編碼初始化、編碼過(guò)程、編碼結(jié)束。參考xvid_decraw.c程序,該程序也在XviD函數(shù)接口的基礎(chǔ)上編寫(xiě)了三個(gè)函數(shù),分別表示解碼初始化、解碼過(guò)程、解碼碼結(jié)束。
[0078]本發(fā)明的視頻編解碼的實(shí)現(xiàn)就是基于上述兩個(gè)例子程序編寫(xiě)的編碼和解碼函數(shù)實(shí)現(xiàn)的。不同點(diǎn)在于:xvid_encraw.c和xvid_decraw.c程序用于編碼、解碼靜態(tài)的圖像文件,編解碼用于動(dòng)態(tài)的視頻流。在服務(wù)器端的視頻采集線程中,主要實(shí)現(xiàn)視頻的編碼過(guò)程。
[0079]將服務(wù)器端和視頻端的程序編寫(xiě)完成后,為了調(diào)用XviD的動(dòng)態(tài)鏈接庫(kù)或靜態(tài)鏈接庫(kù),還需要將源碼編譯后,再與XviD的鏈接庫(kù)鏈接生成可執(zhí)行文件??傊瑢?shí)現(xiàn)XviD的編解碼需要調(diào)用初始化、編解碼過(guò)程、編解碼結(jié)束三個(gè)基本的成員函數(shù)來(lái)實(shí)現(xiàn)。
[0080]如圖7所示,是嵌入式視頻監(jiān)控系統(tǒng)的服務(wù)器端的數(shù)據(jù)幀傳輸結(jié)果。如圖8所示,是嵌入式視頻監(jiān)控系統(tǒng)的PC客戶(hù)端的數(shù)據(jù)幀傳輸結(jié)果。服務(wù)器端標(biāo)識(shí)編碼視頻幀和編碼時(shí)間;PC客戶(hù)端標(biāo)識(shí)解碼視頻幀和解碼時(shí)間。本發(fā)明設(shè)計(jì)的系統(tǒng)可以實(shí)現(xiàn)視頻采集、視頻編解碼、視頻傳輸和視頻播放、視頻保存的功能,可用于無(wú)線視頻監(jiān)控領(lǐng)域,也可用于其他視頻壓縮技術(shù)和視頻通信技術(shù)的研究和開(kāi)發(fā)。
[0081]以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明技術(shù)原理的前提下,還可以做出若干改進(jìn)和變形,這些改進(jìn)和變形也應(yīng)視為本發(fā)明的保護(hù)范圍。
【主權(quán)項(xiàng)】
1.嵌入式視頻監(jiān)控系統(tǒng)的設(shè)計(jì)方法,包括服務(wù)器端設(shè)計(jì)和PC客戶(hù)端設(shè)計(jì),其特征在于, 所述服務(wù)器端設(shè)計(jì)包括如下步驟: 步驟101:初始化設(shè)備并配置網(wǎng)絡(luò)數(shù)據(jù)幀的空間和視頻壓縮幀的大??; 步驟102:采用socket編程實(shí)現(xiàn)視頻數(shù)據(jù)的網(wǎng)絡(luò)接收和網(wǎng)絡(luò)發(fā)送; 步驟103:基于Video4Linux的API進(jìn)行編程,采用內(nèi)存映射方式采集視頻圖像,并測(cè)試是否正確采集視頻圖像,若是,則進(jìn)入步驟104 ;否則,返回步驟101 ; 步驟104:設(shè)置視頻采集的參數(shù),將videodev的對(duì)象設(shè)置為全局變量,作為兩個(gè)線程的共孚資源; 步驟105:為服務(wù)器端創(chuàng)建兩個(gè)并行的線程,分別為:用于采集處理的視頻采集線程和用于網(wǎng)絡(luò)傳輸?shù)姆?wù)線程;視頻采集線程創(chuàng)建完成后,判斷是否退出視頻采集線程,若退出則進(jìn)入步驟106,否則循環(huán)運(yùn)行視頻采集線程;服務(wù)線程創(chuàng)建前,先打開(kāi)socket,將本地IP綁定端口號(hào),實(shí)時(shí)監(jiān)聽(tīng)是否有PC客戶(hù)端需要進(jìn)行網(wǎng)絡(luò)傳輸,若有PC客戶(hù)端需要進(jìn)行網(wǎng)絡(luò)傳輸,則建立網(wǎng)絡(luò)連接;服務(wù)線程創(chuàng)建完成后,判斷是否退出服務(wù)線程,若退出則進(jìn)入步驟106,否則循環(huán)運(yùn)行服務(wù)線程; 步驟106:判斷是否有其他線程在工作,若有則進(jìn)入等待,否則直接結(jié)束退出; 所述PC客戶(hù)端設(shè)計(jì)包括如下步驟: 步驟201:建立socket連接,測(cè)試該連接是否能正確傳輸數(shù)據(jù):若數(shù)據(jù)傳輸正常,就先發(fā)送PC客戶(hù)端的控制命令幀; 步驟202:開(kāi)始讀取網(wǎng)絡(luò)數(shù)據(jù)幀,接收壓縮視頻流; 步驟203:判斷PC客戶(hù)端軟件是否為保存命令,若是保存命令,則將視頻流保存到文件中,執(zhí)行結(jié)束命令;若不是保存命令,就進(jìn)入實(shí)時(shí)視頻播放階段,將視頻流放入緩沖區(qū),并進(jìn)入下一步; 步驟204:判斷緩沖區(qū)的視頻幀是否可解碼:若是,則采用XviD解碼器進(jìn)行解碼,最后由SDL程序播放實(shí)時(shí)視頻圖像;若否,則返回步驟203繼續(xù)將視頻流放入緩沖區(qū),直至可以解碼,播放實(shí)時(shí)視頻圖像,最后執(zhí)行結(jié)束命令。2.根據(jù)權(quán)利要求1所述的嵌入式視頻監(jiān)控系統(tǒng)的設(shè)計(jì)方法,其特征在于,步驟105中視頻采集線程的創(chuàng)建步驟如下: 步驟a)捕獲視頻幀數(shù)據(jù),判斷當(dāng)前網(wǎng)絡(luò)數(shù)據(jù)幀是否正在發(fā)送,若是,則循環(huán)等待,否則將線程互斥鎖上鎖; 步驟b)采用XviD編碼器對(duì)視頻幀數(shù)據(jù)進(jìn)行壓縮,并將壓縮后的數(shù)據(jù)放到網(wǎng)絡(luò)數(shù)據(jù)幀中,等待發(fā)送; 步驟c)將線程互斥鎖解鎖,變換數(shù)據(jù)幀序列,準(zhǔn)備下一次視頻圖像的采集和壓縮。3.根據(jù)權(quán)利要求1所述的嵌入式視頻監(jiān)控系統(tǒng)的設(shè)計(jì)方法,其特征在于,步驟105中服務(wù)線程的創(chuàng)建步驟如下: 步驟i)服務(wù)線程接收PC客戶(hù)端發(fā)送來(lái)的控制命令幀,并且根據(jù)控制命令幀設(shè)置采集參數(shù); 步驟ii)查看線程互斥鎖是否上鎖,若已經(jīng)上鎖,則進(jìn)入循環(huán)等待程序;若沒(méi)有上鎖,則將當(dāng)前序號(hào)的數(shù)據(jù)幀上鎖,即設(shè)置framelocktframeout] = 1,進(jìn)入網(wǎng)絡(luò)數(shù)據(jù)幀發(fā)送流 程; 步驟iii)網(wǎng)絡(luò)數(shù)據(jù)幀發(fā)送后,將當(dāng)前序號(hào)的數(shù)據(jù)幀解鎖,即設(shè)置framelock[frameout] = O,準(zhǔn)備下一幀的網(wǎng)絡(luò)發(fā)送。
【專(zhuān)利摘要】本發(fā)明公開(kāi)了一種嵌入式視頻監(jiān)控系統(tǒng)的設(shè)計(jì)方法,包括服務(wù)器端設(shè)計(jì)和PC客戶(hù)端設(shè)計(jì);對(duì)于服務(wù)器端設(shè)計(jì):基于Video4Linux的API進(jìn)行編程,采用內(nèi)存映射方式采集視頻圖像,并為服務(wù)器端創(chuàng)建兩個(gè)并行線程:視頻采集線程和服務(wù)線程。對(duì)于PC客戶(hù)端設(shè)計(jì),設(shè)計(jì)了視頻流緩沖區(qū)暫存,由XviD解碼器解壓視頻流,由SDL程序進(jìn)行實(shí)時(shí)播放。PC客戶(hù)端還具有保存視頻壓縮流的功能,輸入文件播放命令可以播放保存在硬盤(pán)上的視頻流文件。本發(fā)明采用XviD進(jìn)行編解碼,效率高、功能強(qiáng)大,且XviD是免費(fèi)共享的資源,可在官方網(wǎng)站上直接下載使用,有利于降低嵌入式視頻監(jiān)控系統(tǒng)的設(shè)計(jì)成本。本發(fā)明可用于無(wú)線視頻監(jiān)控領(lǐng)域。
【IPC分類(lèi)】H04N7/18
【公開(kāi)號(hào)】CN105049806
【申請(qǐng)?zhí)枴緾N201510460301
【發(fā)明人】郭潔, 顧燕, 王嫻玨
【申請(qǐng)人】河海大學(xué)
【公開(kāi)日】2015年11月11日
【申請(qǐng)日】2015年7月30日