基于V4L2視頻采集緩存機制應用與實現
摘要:V4L是Linux針對視頻設備的應用程序接口,V4L2為其升級版本,它修復了第一版的很多設計缺陷。然而它提供的常規讀寫函數并不能滿足大數據量的高速傳輸,所以將緩存技術引入到視頻采集領域可以提高系統的吞吐量。提出了一種雙幀內存映射視頻采集機制,由于不需要做數據拷貝動作,減少了讀/寫時限,因而可以提高視頻采集性能。實驗結果表明,采用雙幀內存映射機制在視頻采集時速度快,效率高,達到了預期的實驗效果。
關鍵詞:V4L2;Linux;視頻采集;內存映射
0 引言
V4L(video for linux)是由Alan Cox開發的針對視頻設備的應用程序接口(API),開始出現是在Linux 2.1.x版本內核中,可以實現圖像采集、AM/FM廣播和圖像編解碼等功能。然而,由于它在擴展性和靈活性上的缺陷,漸漸被Bill Dirks設計出的V4L的升級版本V4L2所替代,V4L2開始是在Linux 2.5.x版本內核中集成的,在對視頻設備數據的讀/寫中,應用程序可以通過read/write方法或者內存映射來獲得位于內核空間的圖像數據。 read/write方法是將數據在內核空間和用戶空間之間進行拷貝,而內存映射使應用程序可以直接訪問設備內存,減少了從內核態到用戶態的數據拷貝,因而可以顯著提高系統的吞吐量,下面討論視頻采集中緩存機制的應用和實現。
1 V4L2的視頻采集框架
V4L2采用了分層架構,應用程序接口為上層,而下層則是視頻設備的驅動程序,一般研究領域都是編寫上層的應用程序,通過編程接口來控制視頻設備完成相應的操作和功能。利用V4L2開發的視頻采集程序具有設備無關性,任何支持V4L2的視頻采集設備都可以移植此類程序,因而也提高了視頻采集程序的可移植性。
當視頻設備連接到主機后,驅動程序會首先注冊一個主設備號為81的字符設備,它是硬件惟一的身份標識。驅動程序利用主設備號來識別硬件,而系統內核則是利用主設備號讓設備與對應的驅動程序相結合,同時加載驅動程序的成員函數、次設備號以及其他相關信息,使設備可以正常工作。使用表1中的函數可以訪問 V4L2設備,也可以在應用程序中直接調用。具體功能如表1所示。
其中,ioctl函數的功能非常強大,它可以管理設備的I/O通道,設置視頻的制式和幀格式,還提供查詢當前設備屬性的功能,主要的ioctl命令如表2所示。
評論