做DM6467是在Linux下做視頻采集,僅ARM端
一共有三種視頻采集方式:
1)使用read、write方式:直接使用 read 和 write 函數進行讀寫。這種方式最簡單,但是這種方式會在 用戶空間和內核空間不斷拷貝數據 ,同時在用戶空間和內核空間占用 了 大量內存,效率不高。
2)內存映射方式(mmap):把設備裡的內存映射到應用程序中的內存控件,直接處理設備內存,這是一種有效的方式。上面的mmap函數就是使用這種方式。
3)用戶指針模式:內存由用戶空間的應用程序分配,並把地址傳遞到內核中的驅動程序,然後由 v4l2 驅動程序直接將數據填充到用戶空間的內存中。這點需要在v4l2_requestbuffers裡將memory字段設置成V4L2_MEMORY_USERPTR。
第一種方式效率是最低的,後面兩種方法都能提高執行的效率,但是對於mmap 方式,文檔中有這樣一句描述 –Remember the buffers are allocated in physical memory, as opposed to virtual memory which can be swapped out to disk。 Applications should free the buffers as soon as possible with the munmap () function 。(使用mmap方法的時候,buffers相當於是在內核空間中分配的,這種情況下,這些buffer是不能被交換到虛擬內存中,雖然這種方法不怎麼影響讀寫效率,但是它一直占用著內核空間中的內存,當系統的內存有限的時候,如果同時運行有大量的進程,則對系統的整體性能會有一定的影響。)
所以,對於三種視頻采集方式的選擇,推薦的順序是 userptr 、 mmap 、 read-write 。當使用 mmap 或 userptr 方式的時候,有一個環形緩沖隊列的概念,這個隊列中,有 n 個 buffer ,驅動程序采集到的視頻幀數據,就是存儲在每個 buffer 中。在每次用 VIDIOC_DQBUF 取出一個 buffer ,並且處理完數據後,一定要用 VIDIOC_QBUF 將這個 buffer 再次放回到環形緩沖隊列中。環形緩沖隊列,也使得這兩種視頻采集方式的效率高於直接 read/write 。
但在用mmap是要注意關閉線程是才可訪問》