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 是可选的。