天天看點

基于Linux的v4l2視訊架構驅動編寫

其實,我剛開始一直都不知道怎麼寫驅動,什麼都不懂的,隻知道我需要在做項目的過程中學習,是以,我就自己找了一個關于編寫Linux下的視訊采集監控項目做,然後上學期剛開學的時候聽師兄說,跟院長做項目,沒做出來也沒關系,是以直接退出博士的團隊,投靠了院長的門下,呵呵,說到這裡其實并不是我太見風使駝了,而是····老是讓我做單片機的東東,我嫌沒意思,他也知道我一開始就要學嵌入式,是以,最後,我想了一下,既然不能幫他做項目,那留着也沒啥意思,自己滾蛋吧(呵呵,不過現在似乎馬上就快要繼續幫博士做項目了),是以找了院長做導師。。。進了他的實驗室。廢話完,上菜(唉,誰是我的菜啊)

其實,學習就是一個過程,剛開始最難接受,過後就容易了。。。。

首先在學習v4l2之前,你得起碼先有個攝像頭,不然沒得玩

另外,最好給自己指定一個計劃,有針對性的學習,定下時間,這樣學習才有緊迫感

v4l2架構入門其實并不是很難,進階的我還沒資格說,想當初我剛開始看的時候,也是感覺超級難啊,因為沒有抓住體系,對整體沒有認識,是以我就花了兩天時間天天研究那幾篇文章和程式

程式屬這兩篇文章最為經典了:

http://www.linuxidc.com/Linux/2011-03/33020.htm

http://www.linuxidc.com/Linux/2011-03/33021.htm

基礎知識,我就直接貼出來算了  ,//後是我添加的

基于Linux視訊驅動接口V4L2視訊采集程式設計44253105764

Linux系統中,視訊裝置被當作一個裝置檔案來看待,裝置檔案存放在 /dev目錄下,完整路徑的裝置檔案名為: /dev/video0 .

視訊采集基本步驟流程如下: 打開視訊裝置,設定視訊裝置屬性及采集方式、視訊資料處理,關閉視訊裝置,如下圖所示:

一、打開視訊裝置

打開視訊裝置非常簡單,在V4L2中,視訊裝置被看做一個檔案。使用open函數打開這個裝置:

1.     用非阻塞模式打開攝像頭裝置

int cameraFd;

cameraFd = open("/dev/video0", O_RDWR | O_NONBLOCK);

2.     如果用阻塞模式打開攝像頭裝置,上述代碼變為:

cameraFd = open("/dev/video0", O_RDWR);

關于阻塞模式和非阻塞模式

應用程式能夠使用阻塞模式或非阻塞模式打開視訊裝置,如果使用非阻塞模式調用視訊裝置,即使尚未捕獲到資訊,驅動依舊會把緩存(DQBUFF)裡的東西傳回給應用程式。

二、Linux視訊裝置驅動常用控制指令使用說明

設定視訊裝置屬性通過ioctl來進行設定,ioctl有三個參數,分别是fd, cmd,和parameter,表示裝置描述符,控制指令和控制指令參數。

Linux 視訊裝置驅動接口V4L2支援的常用控制指令如下:

1. 控制指令 VIDIOC_ENUM_FMT      //ENUM什麼意思?自己查查去

功能: 擷取目前視訊裝置支援的視訊格式 。

參數說明:參數類型為V4L2的視訊格式描述符類型 struct v4l2_fmtdesc

傳回值說明: 執行成功時,函數傳回值為 0;struct v4l2_fmtdesc 結構體中的 .pixelformat和 .description 成員傳回目前視訊裝置所支援的視訊格式;

使用舉例:

-------------------------------------------------------------------------------------------------

struct v4l2_fmtdesc fmt;

       memset(&fmt, 0, sizeof(fmt));

       fmt.index = 0;

       fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

       while ((ret = ioctl(dev, VIDIOC_ENUM_FMT, &fmt)) == 0) {

              fmt.index++;

              printf("{ pixelformat = ''%c%c%c%c'', description = ''%s'' }\n",

                            fmt.pixelformat & 0xFF, (fmt.pixelformat >> 8) & 0xFF,

                            (fmt.pixelformat >> 16) & 0xFF, (fmt.pixelformat >> 24) & 0xFF,

                            fmt.description);

       }

-------------------------------------------------------------------------------------------------------

2. 控制指令VIDIOC_QUERYCAP        //query 和cap各代表什麼意思

功能: 查詢視訊裝置的功能 ; 

參數說明:參數類型為V4L2的能力描述類型struct v4l2_capability ;

傳回值說明: 執行成功時,函數傳回值為 0;函數執行成功後,struct v4l2_capability 結構體變量中的傳回目前視訊裝置所支援的功能;例如支援視訊捕獲功能V4L2_CAP_VIDEO_CAPTURE、V4L2_CAP_STREAMING等。

使用舉例:

-------------------------------------------------------------------------------------------------------

struct v4l2_capability cap;  

iret = ioctl(fd_usbcam, VIDIOC_QUERYCAP, &cap);

if(iret < 0)

{

              printf("get vidieo capability error,error code: %d \n", errno);

              return ;

}

------------------------------------------------------------------------------------------------------

執行完VIDIOC_QUERYCAP指令後,cap變量中包含了該視訊裝置的能力資訊,程式中通過檢查cap中的裝置能力資訊來判斷裝置是否支援某項功能。

本篇文章來源于 Linux公社網站(www.linuxidc.com)  原文連結:http://www.linuxidc.com/Linux/2011-03/33022.htm

繼續閱讀