1. 程式人生 > >V4L2視訊採集應用原理

V4L2視訊採集應用原理

具體說明如下:
(1)程式首先使用VIDIOC_REQBUFS向驅動程式請求影象緩衝區,v412_requestbuffers結構體包含了所要求緩衝區的型別及數量,但驅動程式有權決定最後返回的數量,因此程式仍需要使用系統返回的緩衝區數量,在這裡程式返回2個緩衝區。
(2)由於緩衝區數量有2個,呼叫2次mmap()建立起使用者空間和核心空間緩衝區的對應關係,然後讀取mmap()所返回的指標就相當於讀取影象緩衝區。
(3)此時驅動程式仍然不能對影象緩衝區做讀取,呼叫2次VIDIOC_QBUF ioctl將緩衝區加入到驅動程式內部的採集序列,之後採集的影象就會被儲存到這些緩衝區內。
(4)呼叫VIDIOC_STREAM ioctl後,驅動程式開始採集影象,並將影象放置到緩衝區內。
(5)雖然緩衝區內已經存放有影象了,但直接去讀取某個緩衝區還是需要非常小心的,因為緩衝區仍然在驅動程式的影象採集序列中,有可能讀取到一半,驅動程式又使用該緩衝區儲存新的影象,而圖1中的(5)是最後呼叫VIDIOC_STREAMOFF,以停止影象採集,此時驅動程式會自動將所有緩衝區從影象採集序列中移除,所以不需要手動呼叫VIDIOC_DQBUF,接著使用munmap()清除所有的儲存區對映導致影象前後不一致。因此要在讀取緩衝區前,先呼叫VIDIOC_DQBUG ioctl,通知驅動程式不要使用此緩衝區,在這個階段中,通常是以如圖2所示的順序來讀取每個緩衝區的。