4.1. 视频捕获接口

视频捕获设备对模拟视频信号进行采样,并将数字化的图像存储在内存中。现在,几乎所有设备都能以完整的 25 或 30 帧/秒的速度进行捕获。通过此接口,应用程序可以控制捕获过程,并将图像从驱动程序移动到用户空间。

通常,V4L2 视频捕获设备通过名为 /dev/video/dev/video0/dev/video63 的字符设备特殊文件访问,主设备号为 81,次设备号为 0 到 63。/dev/video 通常是指向首选视频设备的符号链接。

注意

视频输出设备也使用相同的设备文件名。

4.1.1. 查询功能

支持视频捕获接口的设备在 v4l2_capability 结构体的 capabilities 字段中设置 V4L2_CAP_VIDEO_CAPTUREV4L2_CAP_VIDEO_CAPTURE_MPLANE 标志,该结构体由 ioctl VIDIOC_QUERYCAP ioctl 返回。作为辅助设备功能,它们还可以支持视频叠加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 中给出。

要查询当前图像格式,应用程序将 v4l2_format 结构体的 type 字段设置为 V4L2_BUF_TYPE_VIDEO_CAPTUREV4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,并使用指向此结构的指针调用 VIDIOC_G_FMT ioctl。驱动程序填充 fmt 联合体的 v4l2_pix_format pix 结构体或 v4l2_pix_format_mplane pix_mp 成员。

要请求不同的参数,应用程序将 v4l2_format 结构体的 type 字段设置为如上所述,并初始化 fmt 联合体的 v4l2_pix_format vbi 结构体的所有字段,或者最好只修改 VIDIOC_G_FMT 的结果,并使用指向此结构的指针调用 VIDIOC_S_FMT ioctl。驱动程序可以调整参数,并最终像 VIDIOC_G_FMT 所做的那样返回实际参数。

VIDIOC_S_FMT 一样,VIDIOC_TRY_FMT ioctl 可用于了解硬件限制,而无需禁用 I/O 或可能耗时的硬件准备。

v4l2_pix_format 结构体和 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。有关详细信息,请参阅 输入/输出