基于嵌入式Linux的3G無(wú)線(xiàn)視頻終端的設計與實(shí)現
2)直接采用CMOS攝像頭作為視頻采集裝置 該視頻采集模塊在硬件上S3C2440帶有CMOS攝像頭接口,在開(kāi)發(fā)板上通過(guò)稱(chēng)為CAMERA的接口引出,并且帶有camera控制器,在本系統中使用了OmniVision公司的OV9650攝像頭。S3C2440支持ITU-R BT601/656格式的數字圖像輸入,支持2個(gè)通道的DMA,Preview通道和Codec通道,參見(jiàn)圖4。本文引用地址:http://dyxdggzs.com/article/150415.htm
Preview通道可以將YCbCr4:2:2格式的圖像轉換為RGB(16bit或24bit)格式的數據,并存放于為PreviewDMA分配的內存中,最大分辨率為640×480。主要用于本地液晶屏顯示,Codec通道可以輸出YCbCr4:2:0或YCbCr4:2:2格式到為Codec DMA分配的內存中。最大分辨率為4 096x4 096,主要用于圖像的編解碼處理。在本系統中使用的是Codec通道。
視頻采集模塊的設計采用的是V4L2(Video for Linux Two)V4L2,它是Linux下開(kāi)發(fā)視頻采集設備驅動(dòng)程序的一套規范,該規范采用分層的方法給驅動(dòng)程序的開(kāi)發(fā)提供了清晰的模型和一致的接口,并且正對視頻設備的應用程序編程也提供了一系列接口函數。其中應用程序處于最上層,V4L2處于中間層,而實(shí)際的硬件設備則處于下層,其本身包括兩層驅動(dòng)結構,上層是videodev模塊,下層為V4L2驅動(dòng)程序。video-dev通過(guò)V4L2驅動(dòng)程序的成員函數來(lái)調用V4L2驅動(dòng)。在V4L2驅動(dòng)的驅動(dòng)程序初始化過(guò)程中,它首先枚舉它將要處理的系統中的設備,為每個(gè)設備填充struct v412_device結構,并且將指向該結構的指針傳遞給v412_register_device()函數,該函數調用v4L2_deviee結構體中的初始化函數對設備進(jìn)行初始化。當v412驅動(dòng)程序初始化完成后,v412通過(guò)傳遞一個(gè)包含驅動(dòng)程序成員函數,次設備號以及相關(guān)信息的結構給videod-ev,從而完成它將要處理設備在videodev的注冊工作,當應用程序通過(guò)系統調用觸發(fā)了某個(gè)驅動(dòng)程序時(shí),控制權首先傳遞給videodev中的函數,videodev將應用程序傳遞的文件或i節點(diǎn)結構指針轉換為相應的v412結構指針,并調用v412中的處理函數。以本系統以OV9650攝像頭為例,其驅動(dòng)框架如圖5所示。
視頻采集過(guò)程如下,應用程序首先打開(kāi)視頻設備文件,攝像頭在系統中對應的設備文件為/dev/camera,通過(guò)系統調用“open(“/ dev/camera”,O_RDWR)”函數打開(kāi)該設備,獲得一個(gè)文件描述符fd,利用ioctl(fd,VIDIOCGPICT,capability)函數獲取攝像頭的相關(guān)信息,例如設備名稱(chēng)、支持的最大最小分辨率、信號源信息等,填充在結構體video_capability中,通過(guò)調用ioctl(fd,VIDIOCGPICT,pict-ure)獲取圖像的相關(guān)信息如采集圖像的對比度、亮度、調色板等屬性,并且填充在video_picture結構體中,在獲取這類(lèi)信息后,可根據實(shí)際需要來(lái)對其重新賦值,具體做法是將需要設置的值賦給相應結構體,然后通過(guò)系統調用ioctl(fd,VIDIOCSPICT,)函數寫(xiě)入設備。在圖像獲取方式上使用mmap()系統調用來(lái)實(shí)現內存映射達到各進(jìn)程共享內層的目的,利用共享內存通信的一個(gè)顯而易見(jiàn)的好處是效率高,因為進(jìn)程可以直接讀寫(xiě)內存,而不需要任何數據的拷貝。使用mmap方式獲取圖像數據,需要首先設置圖像幀的緩沖區結構,即struct video_mmap,如每次采集幀數,圖像高度、寬度,圖像調色板格式等等。然后調用ioctl(fd,VIDIOCMCAPTURE,grab_buf)啟動(dòng)捕獲過(guò)程。調用iotcl(fd,VI-DIOCSYNC,frame)等待采集完成,若該函數成功返回則表示采集完畢,采集到的圖像將放在通過(guò)mmap()映射的內存區域內,讀取該內存數據即可獲得圖像數據,其中frame為當前截取的幀數,V4L2允許一次采集多幀數據,可通過(guò)設置grab buf.frame來(lái)實(shí)現。調用close(fd)函數關(guān)閉設備文件,終止圖像采集。
2.2 視頻數據處理模塊設計
由視頻采集模塊獲取的視頻圖像需要通過(guò)3G網(wǎng)絡(luò )來(lái)進(jìn)行傳輸,而從攝像頭直接采集的未經(jīng)壓縮的數據量非常大,為了在不影響圖像質(zhì)量的前提下提高傳輸效率,本系統中對原始獲得的視頻圖像進(jìn)行了壓縮編碼。由于MPEG-4是專(zhuān)門(mén)為播放流式媒體的高質(zhì)量視頻而設計的,并且MPEG-4標準以其高壓縮比、高質(zhì)量、低傳輸率已經(jīng)成為目前網(wǎng)絡(luò )多媒體傳輸的主要格式和標準。它可利用很窄的帶寬,通過(guò)幀重建技術(shù)壓縮和傳輸數據,以求使得用最少的數據獲得最佳的圖像質(zhì)量并且能夠保存接近于DVD畫(huà)質(zhì)的小體積視頻文件。在本系統中選用開(kāi)源的Xvidcore作為視頻壓縮模塊的核心算法。Xvidcore是一個(gè)高效而且便于移植的編碼軟件。它不僅支持Simple Profile和Advanced Profile,還支持I/P Frames B-Frames Interlacing和GMC,以鉆石和方塊模式來(lái)進(jìn)行PMVFast和EPZS運行估計,是目前比較流行的MPEG-4編碼軟件。Xvidcore源碼可從網(wǎng)上下載免費獲得,目前最新版為xvidcore-1.2.2,它提供了一系列的庫函數及接口函數供應用程序使用。但針對嵌入式系統平臺,要使用該庫需要將其移植到嵌入式系統中。移植過(guò)程如下:
解壓源代碼:tar-zxvf xvidcore-1.2.2.tar.gz;在使用前需要對xvidcore-1.2.2進(jìn)行交叉編譯,步驟如下:
1)設置環(huán)境變量:export=“xvidcore當前所在目錄”;
2)進(jìn)入/build/generic目錄;
3)生成Makefrle:/configure-host=local hostbuild=arm-linux-gcc;//指定交叉編譯工具以便進(jìn)行交叉編譯;
4)編譯源代碼:make。
將交叉編譯生成的庫文件libxvidcore.so.*拷貝到交叉編譯器工作目錄lib子目錄中。完成編碼庫的移植工作。
以上對個(gè)獨立模塊進(jìn)行了介紹,在軟件實(shí)現上對系統進(jìn)行了整體設計,將各個(gè)模塊有機的組合在一起,并充分考慮了系統的可擴展性。
主要結構體如下:
評論