劉 豪
(廣州海格通信集團(tuán)股份有限公司,廣東,廣州510006)
當(dāng)前視頻監(jiān)控領(lǐng)域多采用嵌入式系統(tǒng)來實(shí)現(xiàn)。嵌入式系統(tǒng)涵蓋了嵌入式硬件平臺(tái)和嵌入式軟件平臺(tái),本文將從系統(tǒng)實(shí)現(xiàn)的角度來闡述基于嵌入式Linux的MJPG-Streamer視頻監(jiān)控系統(tǒng)。嵌入式Linux的視頻監(jiān)控技術(shù)已廣泛應(yīng)用于多個(gè)領(lǐng)域,因此該系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)方案具有一定的實(shí)用性和參考價(jià)值。
本系統(tǒng)設(shè)計(jì)方案中,硬件采用友善之臂的Mini2440開發(fā)平臺(tái),攝像頭采用中星微的USB2.0攝像頭,這是一款高性價(jià)比的圖像數(shù)據(jù)采集處理器,支持VGA和SXGA視頻模式,其像素最高達(dá)130萬。
如圖1所示為視頻監(jiān)控系統(tǒng)設(shè)計(jì)方案原理框圖。USB攝像頭通過USB接口與Mini2440的USB Host接口相連。軟件方面,需要在S3C2440上實(shí)現(xiàn)USB攝像頭驅(qū)動(dòng)軟件,同時(shí)在S3C2440處理器上運(yùn)行MJPG-Streamer軟件,利用MJPG-Streamer實(shí)現(xiàn)的web服務(wù)器功能提供網(wǎng)絡(luò)訪問支持,遠(yuǎn)程PC機(jī)通過瀏覽器訪問該視頻監(jiān)控系統(tǒng)的web服務(wù)器,MJPG-Streamer程序?qū)SB攝像頭采集到的視頻數(shù)據(jù)放到后臺(tái)進(jìn)行處理,然后通過web的http協(xié)議將視頻數(shù)據(jù)傳輸?shù)竭h(yuǎn)端的PC機(jī),然后通過瀏覽器顯示出來,從而達(dá)到遠(yuǎn)程視頻監(jiān)控的目的。
中星微USB攝像頭的VC0345模塊是一個(gè)標(biāo)準(zhǔn)的UVC設(shè)備。本文將在Linux2.6.32內(nèi)核版本中移植和開發(fā)UVC驅(qū)動(dòng)代碼,該驅(qū)動(dòng)代碼路徑為drivers/media/video/uvc/,通過查看該目錄下的Makefile文件可知每個(gè)*.c文件生成對(duì)應(yīng)的一個(gè)*.o文件。最后鏈接成一
uvcvideo.o文件。Makefile代碼如下所示。
uvcvideo-objs:=uvc_driver.o uvc_queue.o uvc_v4l2.o uvc_video.o
uvc_ctrl.o uvc_status.o uvc_isight.o
obj-$(CONFIG_USB_VIDEO_CLASS)+=uvcvideo.o
在Linux內(nèi)核配置中,選擇Device?Drivers->Multimedia support->Video capture adapters->V4L USB devices->USB Video Class(UVC)配置,那么Makefile將生成的uvcvideo.o編譯進(jìn)Linux內(nèi)核。
在uvc_driver.c源碼文件中包含了典型的UVC模塊加載uvc_init和卸載uvc_cleanup的函數(shù)。
UVC設(shè)備驅(qū)動(dòng)初始化模塊函數(shù)uvc_init調(diào)用了usb_register注冊(cè)函數(shù),將UVC設(shè)備視為一個(gè)標(biāo)準(zhǔn)的USB設(shè)備。其中uvc_driver結(jié)構(gòu)體中的name將注冊(cè)進(jìn)USB?Core的驅(qū)動(dòng)名字,它會(huì)顯示在/sys/bus/usb/drivers/下,但它并不是應(yīng)用程序?qū)⒁x寫的設(shè)備文件。當(dāng)UVC設(shè)備插入的時(shí)候,會(huì)調(diào)用uvc_probe函數(shù)來探測(cè)視頻設(shè)備,包括視頻的格式和設(shè)備控制參數(shù)等,內(nèi)核需要id_table用來判斷插入的設(shè)備是否適配,然后將初始化USB的URB中斷,接收USB接口采集到的視頻數(shù)據(jù)。當(dāng)UVC設(shè)備拔出的時(shí)候,會(huì)調(diào)用uvc_disconnect函數(shù)。綜上所述,UVC驅(qū)動(dòng)模塊處理流程如圖2所示。
UVC驅(qū)動(dòng)程序雖然是一個(gè)模塊文件,但是它里面并沒有提供fops的文件操作函數(shù),而是把該操作的open、read、write、ioctl和mmap等用戶接口函數(shù)放在V4L2驅(qū)動(dòng)程序去實(shí)現(xiàn)。V4L2的fops名字叫做uvc_fops,定義在uvc_v4l2.c中。該結(jié)構(gòu)體代碼實(shí)現(xiàn)如下:
const struct v4l2_file_operations uvc_fops={
.owner=THIS_MODULE,
.open =uvc_v4l2_open,
.release=uvc_v4l2_release,
.ioctl =uvc_v4l2_ioctl,
.read =uvc_v4l2_read,
.mmap=uvc_v4l2_mmap,
.poll =uvc_v4l2_poll,
};
V4L2的子系統(tǒng)是圍繞video_device這個(gè)結(jié)構(gòu)體建立的,它代表的是一個(gè)V4L2設(shè)備。video_device的file_operations[2]結(jié)構(gòu)體包含常規(guī)的函數(shù)指針。視頻設(shè)備通常都包括open、read、write、release函數(shù),這取決于設(shè)備的功能是輸入還是輸出。對(duì)于視頻流設(shè)備而言,傳輸數(shù)據(jù)一般使用poll和mmap方法。同時(shí),視頻設(shè)備還定義了一系列的控制參數(shù),所有這些視頻參數(shù)一般都由ioctl函數(shù)實(shí)現(xiàn)。uvc_fops結(jié)構(gòu)體實(shí)現(xiàn)之后是通過uvc_driver.c中的uvc_register_video函數(shù)將UVC驅(qū)動(dòng)和V4L2驅(qū)動(dòng)關(guān)聯(lián)起來實(shí)現(xiàn)一個(gè)視頻驅(qū)動(dòng)的整體框架程序,因此用戶就可以通過V4L2接口函數(shù)操作UVC視頻設(shè)備了。
本系統(tǒng)視頻采集流程如圖3所示,V4L2采用流水線的方式,操作更簡(jiǎn)單直觀,基本遵循打開視頻設(shè)備、設(shè)置視頻設(shè)備屬性和采集模式、處理采集數(shù)據(jù)、關(guān)閉視頻設(shè)備。
MJPG-streamer是一個(gè)輕量級(jí)的視頻服務(wù)器開源軟件,該軟件基于IP協(xié)議網(wǎng)絡(luò),從USB攝像頭中獲取視頻數(shù)據(jù)并傳輸JPEG格式的圖像到瀏覽器,例如IE等瀏覽器,甚至是一個(gè)運(yùn)行了TCPMP播放器的Windows移動(dòng)設(shè)備。
本系統(tǒng)MJPG-streamer使用input_uvc輸入組件,其主要功能是獲取攝像頭拍攝的圖像并將其壓縮編碼,同時(shí)MJPG-Streamer使用了output_http作為輸出組件,該輸出組件采用httpd作為web服務(wù)器,其作用是可通過瀏覽器訪問該服務(wù)器并監(jiān)控和顯示視頻流。
MJPG-Streamer運(yùn)行過程流程如圖5所示。
本系統(tǒng)基于友善之臂的Mini2440開發(fā)平臺(tái),通過開發(fā)Linux的UVC-V4L2驅(qū)動(dòng)軟件和MJPG-Streamer應(yīng)用軟件成功實(shí)現(xiàn)了基于嵌入式Linux的視頻采集與web遠(yuǎn)程監(jiān)控系統(tǒng)。圖6是Windows7下通過IE瀏覽器遠(yuǎn)程訪問該視頻監(jiān)控系統(tǒng)看到的實(shí)時(shí)視頻流監(jiān)控圖像和控制視頻終端界面,在實(shí)際的項(xiàng)目和產(chǎn)品開發(fā)中具有一定的參考和使用價(jià)值。

圖5 實(shí)時(shí)視頻監(jiān)控圖像
[1][美]科波特(Corbet,J.)等.魏永明,耿岳,鐘書毅譯.Linux設(shè)備驅(qū)動(dòng)程序(第三版)[M].北京:中國(guó)電力出版社,2005.11.
[2]李俊編著.嵌入式Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解[M].北京:人民郵電出版社,2008.3.