了解網路攝像頭的 Linux 設備驅動程序
據我所知,設備驅動程序是軟體的一部分,它能夠與連接到電腦的特定類型的設備進行通信。
對於 USB 網路攝像頭,負責的驅動程序是支持任何符合 UVC 的設備的 UVC。這意味著使作業系統或其他電腦程序能夠訪問硬體功能,而無需知道正在使用的硬體的精確細節。
出於這個原因,我通過執行以下命令安裝了 UVC Linux 設備驅動程序:
opkg install kernel-module-uvcvideo
網路攝像頭已被 Linux 核心辨識:
dev/video0
. 但是,我仍然無法使用 FFmpeg 執行影片流,因為我缺少 V4L2 API。我通過配置核心安裝了 V4L2。我的查詢是:
- UVC驅動和V4L2是如何联系在一起的?
- V4L2 API 的目的是什麼?
- 如果我沒有先安裝UVC,它會與V4L2一起安裝嗎?
LinuxTV 指的是:uvcvideo 驅動程序實現僅遵循 V4L2 API。這意味著 UVC 是 V4L2 API 的一部分嗎?
USB 影片類 (UVC) 是USB 網路攝像頭等應該符合的*規範。*這樣,它們可以在任何支持符合 UVC 的設備的系統上使用。
V4L2 是 linux UVC 實現所依賴的 linux 核心影片子系統。換句話說,核心中的UVC 支持需要 V4L2,但反之則不然。
令人驚訝的是,您可以找到多少有關 Video4Linux2 的文件 - 但其中沒有一個真正解釋了Video4Linux是什麼。
首先,Video4Linux2是一個Linux驅動框架。框架驅動程序實際上並不直接控制設備。相反,它們提供了某類設備的抽像模型,在本例中為應用程序使用的影片設備。驅動程序框架提供三個主要好處:
- 為應用程序提供統一的 API 以與非常廣泛的物理設備一起使用,無論是通過 USB、PCIe、MIPI、乙太網還是其他類型的數據傳輸匯流排連接
- 在核心中,框架包含特定類的幾乎所有設備驅動程序所需的程式碼類型,從而大大減少了不同程式碼的數量
- 在核心中,框架為編寫新的低級驅動程序提供了藍圖,這些驅動程序實際上控制了硬體,從而簡化了驅動程序的開發。
因此,V4L2 驅動程序是驅動 UVC 驅動程序的高級驅動程序,它驅動可能驅動更低級別硬體驅動程序的 USB 驅動程序。
這種套娃模型在 Linux 核心驅動樹中非常常見。V4L2 是更複雜的範例之一,因為一些攝像頭設備需要訪問多個層中的大量子設備,這些子設備控制攝像頭並在圖像處理器等各種組件之間路由攝像頭的輸出。
您仍然可以使用設備文件和“ioctl”系統呼叫直接從使用者空間訪問 UVC 驅動程序,而無需通過 V4L2 驅動程序,並且您仍然可以使用它的設備文件和“ioctl”直接從使用者空間訪問底層 USB 驅動程序。
作為一個提供多種設備通用功能的通用框架,V4L2 並沒有為您提供UVC 驅動程序可以提供的**所有功能(假設您的設備實際上提供了比支持 V4L2 所需的更多的 UVC 功能) .
因此,如果您有一個確實提供 UVC 規範中指定的所有功能的 UVC 設備,那麼為了實際使用其中一些功能,您需要直接通過設備文件和“ioctl”系統訪問 UVC 驅動程序呼叫,假設 Linux 核心 UVC 驅動程序實際上支持所有的 UVC 規範。
然而,
uvcvideo 驅動程序實現僅遵循 V4L2 API
是在目前的 Linux 核心中,UVC 驅動程序實際上並沒有提供比 V4L2 所需的更多的 UVC 功能支持。
核心中的 V4L2 支持本身並不提供 UVC 或 USB 支持或較低級別的 USB 硬體支持。