V4L2開啟video裝置注意(讀寫許可權)

2021-05-25 23:19:08 字數 795 閱讀 7703

v4l2程式設計中在open("/dev/video", ...)時應注意:

攝像頭採集到的資料是最開始是儲存在核心空間我們申請的緩衝區中的,具體設定如下:

req.count = 5;

req.type = v4l2_buf_type_video_capture; //資料流型別

req.memory = v4l2_memory_mmap;   //使用mmap方式對映

if (ioctl(fd, vidioc_reqbufs, &req) == -1)     /*在核心空間申請count個快取空間*/

如果我們希望採集這些核心空間的的資料幀的話,前提就是將核心空間相關資料對映到使用者空間以方便應用程式能夠直接訪問這些資料幀。這樣就會用到mmap操作(當然還有其他方式,由req.memory 確定使用mmap方法)。

mmap函式實現把乙個檔案對映到乙個記憶體區域,從而我們可以像讀寫記憶體一樣讀寫檔案,他比單純呼叫read/write也要快上許多。在某些時候我們可以把記憶體的內容拷貝到乙個檔案中實現記憶體備份,當然,也可以把檔案的內容對映到記憶體來恢復某些服務。另外,mmap實現共享記憶體也是其主要應用之一,mmap系統呼叫使得程序之間通過對映同乙個普通檔案實現共享記憶體。

mmap成功操作有以下要求:

1.進行檔案對映的描述符必須擁有讀許可權,否則會產生sigsegv訊號

2.把記憶體內容寫入對映檔案時,必須確保被寫檔案當前位置到檔案結尾的長度不小於所寫內容長度,否則產生sigbus訊號

3.關閉檔案描述符並不能保證檔案內容不被修改 

所以最好以讀寫方式開啟裝置檔案,否則執行對映時會出現許可權拒絕的現象。

基於Streaming I O的V4L2裝置使用

基於v4l2的應用,通常面臨著大塊資料的讀取與拷貝等問題。尤其在嵌入式系統中,對於實時效能要求較高的應用,拷貝會花上幾十個ms的時間,這通常輕則造成使用者體驗差,重則導致產品質量不達標。v4l2 framework定義了幾種不同的方式,用於從裝置中讀取資料,這篇文章簡要介紹下在streaming i...

V4L2程式設計

include include include include include include include include include include typedef struct buftype buftype user buf int n buffer 0 開啟攝像頭裝置 int ope...

V4L2 程式設計

v4l2程式設計 1.定義 2.工作流程 開啟裝置 檢查和設定裝置屬性 設定幀格式 設定一種輸入輸出方法 緩衝區管理 迴圈獲取資料 關閉裝置。3.裝置的開啟和關閉 include int open const char device name,int flags include int close ...