基於嵌入式linux和s32410平台的視頻採集

來源:互聯網
上載者:User

隨著多媒體技術、網路技術的迅猛發展和後PC機時代的到來,利用嵌入式系統實現遠程視頻監控、可視電話和視頻會議等應用已成為可能。為了實現這些應用,即時獲得視頻資料是一個重要環節。針對這一點,本文在基於嵌入式Linux系統平台上,利用Video4Linux核心應用編程介面函數,實現了單幀映像和視頻連續幀的採集,並儲存成檔案的形式供進一步視頻處理和網路傳輸用。
1 系統平台上的硬體系統
本文使用的系統平台硬體功能框圖1所示。該平台採用Samsung公司的處理器S3C2410。該處理器內部整合了ARM公司ARM920T處理器核的32位微控制器,資源豐富,帶獨立的16KB的指令Cache和16KB資料Cache、LCD控制器、RAM控制器、NAND快閃記憶體控制器、3路UART、4路DMA、4路帶PWM的Timer、並行I/O口、8路10位ADC、Touch Screen介面、I2C介面、I2S介面、2個USB介面控制器、2路SPI,主頻最高可達203MHz。在處理器豐富資源的基礎上,還進行了相關的配置和擴充,平台配置了16MB 16位的Flash和64MB 32位的SDRAM。通過乙太網路控制器晶片DM9000E擴充了一個網口,另外引出了一個HOST USB介面。通過在USB介面上外接一個帶USB口的網路攝影機,將採集到的視頻映像資料放入輸入緩衝區中。然後,或者儲存成檔案的形式,或者運行移植到平台上的影像處理程式,對緩衝的映像資料直接進行相關處理,再儲存並打成UDP包。最後,通過網路介面將映像發送到Internet上。本文只討論其中視頻採集部分的具體實現。
2 系統平台中的軟體系統
2.1 Linux與嵌入式系統
Linux具有核心小,效率高,原始碼開放,核心直接提供網路支援等優點。但嵌入式系統的硬體資源畢竟有限,因此不能直接把Linux作為作業系統,需要針對具體的應用通過配置核心、裁減shell和嵌入式C庫對系統定製,使整個系統能夠存放到容量較小的Flash中。Linux的動態模組載入,使Linux的裁減極為方便 ,高度模組化的組件使添加非常容易。正因為Linux的上述優點,在本文實現的平台上,使用的作業系統是對Linux進行了定製的armlinux。它啟用了MMU(記憶體管理單元),是針對支援MMU的處理器設計的。
2.2 開發環境的建立
絕大多數Linux的軟體開發都以native方式進行,即本機開發、調試,本機啟動並執行方式。這種方式通常不適於嵌入式系統的軟體開發,因為對於嵌入式系統的開發,它沒有足夠的資源在本機(即嵌入式系統平台)運行開發工具和調試工具。通常的嵌入式系統軟體開發採用交叉編譯調試的方式。交叉編譯調試環境建立在宿主機(即圖1所示通過串口串連的宿主機PC)上,對應的開發板叫做目標板(即嵌入式ARM2410系統)。
通常宿主機和目標板上的處理器不同,宿主機通常為Intel處理器,而目標板1所示為SAMSUNG S3C2410,所以程式需要使用針對處理器特點的編譯器才能產生在相應平台上可啟動並執行代碼。GNU編譯器提供這樣的功能,在編譯時間,可以選擇開發所需的宿主機和目標機,從而建立開發環境。在進行嵌入式開發前的第一步工作就是把一台PC機作為宿主機開發機,並在其上安裝指定的作業系統。對於嵌入式Linux,宿主機PC上應安裝Linux系統。之後,在宿主機上建立交叉編譯調試的開發環境,開發環境的具體建立這裡不細談。本文採用移植性很強的C語言在宿主機上編寫視頻採集程式,再利用交叉編譯調試工具編譯連結產生可執行代碼,最後向目標平台移植。
3 視頻採集的具體實現
上面提到系統平台上啟動並執行是armlinux。在啟動後,啟用了MMU,系統進入保護模式,所以應用程式就不能直接讀寫外設的I/O地區(包括I/O連接埠和I/O記憶體),這時一般就要藉助於該外設的驅動來進入核心完成這個工作。本系統中的視頻採集分兩步實現:一是為USB口數位網路攝影機在核心中寫入驅動,二是要再寫入上層應用程式擷取視頻資料。本文著重討論後一步。
3.1 USB口數位網路攝影機的驅動實現
在Linux下,裝置驅動程式可以看成Linux核心與外部裝置之間的介面。裝置驅動程式嚮應用程式屏蔽了硬體實現了的細節,使得應用程式可以像操作普通檔案一樣來操作外部裝置,可以使用和操作檔案中相同的、標準的系統調用介面函數來完成對硬體裝置的開啟、關閉、讀寫和I/O控制操作,而驅動程式的主要任務也就是要實現這些系統調用函數。本系統平台使用的嵌入式armLinux系統在核心主要功能上與Linux作業系統沒本質區別,所以驅動程式要實現的任務也一樣,只要編譯時間使用的編譯器、部分標頭檔和庫檔案等要涉及到具體處理器體繫結構,這些都可以在Makefile檔案中具體指定。
    Video4Linux(簡V4L)是Linux中關於視頻裝置的核心驅動,它為針對視頻裝置的應用程式編程提供一系列介面函數,這些視頻裝置包括現今市場上流行的TV卡、視頻捕捉卡和USB網路攝影機等。對於USB口網路攝影機,其驅動程式中需要提供基本的I/O操作介面函數open、read、write、close的實現。對中斷的處理實現,記憶體映射功能以及對I/O通道的控制介面函數ioct1的實現等,並把它們定義在struct file_operations中。這樣當應用程式對裝置檔案進行諸如open、close、read、write等系統叫用作業時,Linux核心將通過file_operations結構訪問驅動程式提供的函數。例如,當應用程式對裝置檔案執行讀操作時,核心將調用file_operations結構中的read函數。在系統平台上對USB口數位網路攝影機驅動,首先把USB控制器驅動模組靜態編譯進核心,使平台中支援USB介面,再在需要使用網路攝影機採集時,使用insmode動態載入其驅動模組,這樣網路攝影機就可正常工作了,接著進行了下一步對視頻流的採集編程。
3.2 Video4Linux下的網路攝影機採集編程
在USB網路攝影機被驅動後,只需要再編寫一個對視頻流採集的應用程式就可以了。根據嵌入式系統開發特徵,先在宿主機上編寫應用程式,再使用交叉編譯器進行編譯連結,產生在目標平台的可執行檔。宿主機與目標板通訊採用列印終端的方式進行交叉調試,成功後移植到目標平台。本文編寫採集程式是在安裝Linux作業系統的宿主機PC機上進行的,下面是具體論述。
(1)程式中定義的資料結構
struct voide_capability grab_cap;
struct voide_picture grab_pic;
struct voide_mmap grab_buf;
struct voide_mbuf grab_vm;
這些資料結構都是由Video4Linux支援的,它們的用途如下:
*video_capability包含網路攝影機的基本資料,例如裝置名稱、支援的最大最小解析度、訊號源資訊等,分別對應著結構體中成員變數name[32]、maxwidth、maxheight、minwidth、minheight、channels(訊號源個數)、type等;
*voide_picture包含裝置採集映像的各種屬性,如brightness(亮度)、hue(色調)、contrast(對比)、whiteness(色度)、depth(深度)等;
*video_mmap用於記憶體映射;
*voido_mbuf利用mmap進行映射的幀資訊,實際上是輸入到網路攝影機儲存空間緩衝中的幀資訊,包括size(幀的大小)、frames(最多支援的幀數)、offsets(每幀相對基址的位移)。
程式中用到的主要系統調用函數有:open("/dev/voideo0",int flags)、close(fd)、mmap(void *start,size_t length,int prot,int flags,int fd,off_t offset)、munmap(void *start,size_tlength)和ioctl(int fd,int cmd,…)。
前面提到Linux系統中把裝置看成裝置檔案,在使用者空間可以通過標準的I/O系統調用函數操作裝置檔案,從而達到與裝置通訊互動的目的。當然,在裝置驅動中要提供對這些函數的相應支援。這裡說明一下ioctl(int fd,int cmd,…)函數,它在使用者程式中用來控制I/O通道,其中,fd代表裝置檔案描述符,cmd代表使用者程式對裝置的控制命令,省略符號一般是一個表示類型長度的參數,也可沒有。
(2)採集程式實現過程
首先開啟視頻裝置,網路攝影機在系統中對應的裝置檔案為/dev/video0,採用系統調用函數grab_fd=open("/dev/video0",O_RDWR),grab_fd是裝置開啟後返回的檔案描述符(開啟錯誤返回-1),以後的系統調用函數就可使用它來對裝置檔案進行操作了。接著,利用ioct1(grab_fd,VIDIOCGCAP,&grab_cap)函數讀取struct video_capability中有關網路攝影機的資訊。該函數成功返回後,這些資訊從核心空間拷貝到使用者程式空間grab_cap各成員分量中,使用printf函數就可得到各成員分量資訊,例如printf("maxheight=%d",grab_fd.maxheight)獲得最大垂直解析度的大小。不規則用ioct1(grab_fd,VIDIOCGPICT,&grab_pic)函數讀取網路攝影機緩衝中voideo_picture資訊。在使用者空間程式中可以改變這些資訊,具體方法為先給分量賦新值,再調用VIDIOCSPICT ioct1函數,例如:
grab_fd.depth=3;
if(ioct1(grab_fd,VIDIOCSPICT,&grab_pic)<0)
{perror("VIDIOCSPICT");return -1;};
完成以上初始化裝置工作後,就可以對視頻映像截取了,有兩種方法:一種是read()直接讀取;另外一種mmap()記憶體映射。Read()通過核心緩衝區來讀取資料;而mmap()通過把裝置檔案對應到記憶體中,繞過了核心緩衝區,最快的磁碟訪問往往還是慢於最慢的記憶體訪問,所以mmap()方式加速了I/O訪問。另外,mmap()系統調用使得進程之間通過映射同一檔案實現共用記憶體,各進程可以像訪問普通記憶體一樣對檔案進行訪問,訪問時只需要使用指標而不用調用檔案操作函數。因為mmap()的以上優點,所以在程式實現中採用了記憶體映射方式,即mmap()方式。
利用mmap()方式視頻裁取具體進行操作如下。
①先使用ioct1(grab_fd,VIDIOCGMBUF,&grab_vm)函數獲得網路攝影機儲存緩衝區的幀資訊,之後修改voideo_mmap中的設定,例如重新設定映像幀的垂直及水平解析度、彩色顯示格式。可利用如下語句
grab_buf.height=240;
grab_buf.width=320;
grab_buf.format=VIDEO_PALETTE_RGB24;
②接著把網路攝影機對應的裝置檔案對應到記憶體區,具體使用grab_data=(unsigned char*)mmap(0,grab_vm.size,PROT_READ|PROT_WRITE,MAP_SHARED,grad_fd,0)操作。這樣裝置檔案的內容就映射到記憶體區,該映射內容區可讀可寫並且不同進程間可共用。該函數成功時返回映像記憶體區的指標,挫敗時傳回值為-1。
下面對單幀採集和連續幀採集進行說明:
*單幀採集。在上面擷取的網路攝影機儲存緩衝區幀資訊中,最多可支援的幀數(frames的值)一般為兩幀。對於單幀採集只需設定grab_buf.frame=0,即採集其中的第一幀,使用ioctl(grab_fd,VIDIOCMCAPTURE,&grab_buf)函數,若調用成功,則啟用裝置真正開始一幀映像的截取,是非阻塞的。接著使用ioct1(grab_fd,VIDIOCSYNC,&frame)函數判斷該幀映像是否截取完畢,成功返回表示截取完畢,之後就可把映像資料儲存成檔案的形式。
*連續幀採集。在單幀的基礎上,利用grab_fd.frames值確定採集完畢網路攝影機框架緩衝區幀資料進行迴圈的次數。在迴圈語句中,也是使用VIDIOCMCCAPTURE ioct1和VIDIOCSYNC ioctl函數完成每幀截取,但要給採集到的每幀映像賦地址,利用語句buf=grab_data+grab_vm.offsets[frame],然後儲存檔案的形式。若要繼續採集可再加一個外迴圈,在外迴圈語句只要給原來的內迴圈再賦frame=0即可。
4 小結
筆者最後在宿主機PC上使用交叉編譯器編譯連結連續幀採集程式(以雙幀採集為例並儲存成bmp檔案檔案形式)使之產生可執行代碼,並完成了向目標平台的移植。為了進一步觀察採集的映像效果,筆者在目標平台帶網路支援的基礎上,編寫了一個簡單的網路通訊程式,把採集到並儲存為bmp的影像檔通過網路傳輸到PC機上進行顯示,把採集到並儲存為bmp的影像檔通過網路傳輸到PC機上進行顯示,通過對效果的分析,再回到採集程式中重新設定video_picture中的資訊,如亮度、對比等和voide_mmap中的解析度,重新移植以達到最好效果為準。
在圖1中的嵌入式系統平台上,應用本文所述方法完成視頻採集工作,再加上相關的視頻處理並接入網路,就構成了一個智能終端裝置,可用於工廠、銀行及小區等場合全天候的智能監控,具有廣闊的市場和應用前景

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.