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

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