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_capabilitycapabilities 字段中设置 V4L2_CAP_VIDEO_CAPTUREV4L2_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_formattype 字段设置为 V4L2_BUF_TYPE_VIDEO_CAPTUREV4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,并调用 VIDIOC_G_FMT ioctl,传入指向该结构的指针。驱动程序会填充 fmt union 中的 struct v4l2_pix_formatpix 成员或 struct v4l2_pix_format_mplanepix_mp 成员。

要请求不同的参数,应用程序将 struct v4l2_formattype 字段设置为如上所述,并初始化 fmt union 中的 struct v4l2_pix_formatvbi 成员的所有字段,或者更好的做法是只修改 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_FMTVIDIOC_S_FMTVIDIOC_TRY_FMT ioctl 的规范。视频捕获设备必须实现 VIDIOC_G_FMTVIDIOC_S_FMT ioctl,即使 VIDIOC_S_FMT 忽略所有请求并始终像 VIDIOC_G_FMT 那样返回默认参数。VIDIOC_TRY_FMT 是可选的。

4.1.4. 读取图像

视频捕获设备可能支持read() 函数和/或流式(内存映射用户指针)I/O。有关详细信息,请参阅输入/输出