4.1. 影片捕獲介面¶
影片捕獲裝置對模擬影片訊號進行取樣,並將數字化影像儲存在記憶體中。如今,幾乎所有裝置都可以以完整的 25 或 30 幀/秒進行捕獲。透過此介面,應用程式可以控制捕獲過程,並將影像從驅動程式移動到使用者空間。
傳統上,V4L2 影片捕獲裝置透過名為 /dev/video 和 /dev/video0 到 /dev/video63 的字元裝置特殊檔案訪問,主裝置號為 81,次裝置號為 0 到 63。/dev/video 通常是首選影片裝置的符號連結。
注意
影片輸出裝置也使用相同的裝置檔名。
4.1.1. 查詢功能¶
支援影片捕獲介面的裝置會在 ioctl VIDIOC_QUERYCAP ioctl 返回的 struct v4l2_capability 的 capabilities 欄位中設定 V4L2_CAP_VIDEO_CAPTURE 或 V4L2_CAP_VIDEO_CAPTURE_MPLANE 標誌。作為次要裝置功能,它們還可能支援影片疊加 (V4L2_CAP_VIDEO_OVERLAY) 和原始 VBI 捕獲 (V4L2_CAP_VBI_CAPTURE) 介面。必須支援讀/寫或流式 I/O 方法中的至少一種。調諧器和音訊輸入是可選的。
4.1.2. 補充功能¶
影片捕獲裝置應根據需要支援音訊輸入、調諧器和調製器、控制、裁剪和縮放以及流引數 ioctl。所有影片捕獲裝置都必須支援影片輸入 ioctl。
4.1.3. 影像格式協商¶
捕獲操作的結果由裁剪和影像格式引數決定。前者選擇要捕獲的影片畫面區域,後者定義影像在記憶體中的儲存方式,即 RGB 或 YUV 格式、每畫素的位數或寬度和高度。它們共同定義了影像在此過程中的縮放方式。
通常,這些引數在open() 時不會重置,以便允許 Unix 工具鏈像處理普通檔案一樣對裝置進行程式設計和讀取。編寫良好的 V4L2 應用程式會確保它們真正得到所需的結果,包括裁剪和縮放。
裁剪初始化至少需要將引數重置為預設值。示例請參見影像裁剪、插入和縮放 -- CROP API。
要查詢當前影像格式,應用程式將 struct v4l2_format 的 type 欄位設定為 V4L2_BUF_TYPE_VIDEO_CAPTURE 或 V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,並呼叫 VIDIOC_G_FMT ioctl,傳入指向該結構的指標。驅動程式會填充 fmt union 中的 struct v4l2_pix_format 的 pix 成員或 struct v4l2_pix_format_mplane 的 pix_mp 成員。
要請求不同的引數,應用程式將 struct v4l2_format 的 type 欄位設定為如上所述,並初始化 fmt union 中的 struct v4l2_pix_format 的 vbi 成員的所有欄位,或者更好的做法是隻修改 VIDIOC_G_FMT 的結果,然後呼叫 VIDIOC_S_FMT ioctl,傳入指向該結構的指標。驅動程式可以調整引數,並最終像 VIDIOC_G_FMT 那樣返回實際引數。
與 VIDIOC_S_FMT 類似,VIDIOC_TRY_FMT ioctl 可用於瞭解硬體限制,而無需停用 I/O 或可能耗時的硬體準備。
struct v4l2_pix_format 和 struct v4l2_pix_format_mplane 的內容在影像格式中討論。有關詳細資訊,另請參閱 VIDIOC_G_FMT、VIDIOC_S_FMT 和 VIDIOC_TRY_FMT ioctl 的規範。影片捕獲裝置必須實現 VIDIOC_G_FMT 和 VIDIOC_S_FMT ioctl,即使 VIDIOC_S_FMT 忽略所有請求並始終像 VIDIOC_G_FMT 那樣返回預設引數。VIDIOC_TRY_FMT 是可選的。