1 概述
V4L2 是 Linux 内核中视频设备驱动的标准接口规范,广泛用于摄像头、电视调谐器、视频采集卡等设备。
-
编译内核开启支持
-
修改设备树
-
构建根文件系统配置工具集
2 虚拟机中测试
2.1 安装
apt install v4l-utils
2.2 查看设备列表
v4l2-ctl --list-devices
HikCamera: UVC Camera (usb-0000:02:03.0-1):
/dev/video0
/dev/video1
/dev/media0
-
不同功能通道
video0:主视频流(如MJPG、YUYV格式的实时预览)video1:可能是元数据通道(如时间戳、IMU数据)、静态抓拍通道,或者同一个物理摄像头的另一个实例(例如支持同时输出高低两种分辨率)。
-
UVC扩展单元 某些UVC摄像头内部有多个逻辑子设备(如视频处理单元、静态图像捕获单元),内核驱动可能为每个子设备单独创建一个
/dev/video节点。 -
/dev/media0
Media Controller设备节点,用于管理摄像头内部的复杂管线。
- 作用:当V4L2设备内部有多个模块(如传感器、ISP、缩放器)时,
/dev/media0允许用户空间程序查看和配置这些模块之间的连接关系(称为“pipeline”)。 - 典型场景:UVC摄像头如果实现了媒体控制器API,你会看到这个节点。它本身不直接传输视频,而是通过
media-ctl工具来配置内部路由,然后再通过/dev/video0采集数据。
- 作用:当V4L2设备内部有多个模块(如传感器、ISP、缩放器)时,
2.3 设备详细
v4l2-ctl -d /dev/video0 --all
Driver Info:
Driver name : uvcvideo
Card type : HikCamera: UVC Camera
Bus info : usb-0000:02:03.0-1
Driver version : 5.15.199
....
2.4 设备支持的分辨率
v4l2-ctl -d /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'YUYV' (YUYV 4:2:2)
Size: Discrete 256x392
Interval: Discrete 0.040s (25.000 fps)
....
[1]: 'MJPG' (Motion-JPEG, compressed
Size: Discrete 120x160
Interval: Discrete 0.040s (25.000 fps)
....
[2]: 'H264' (H.264, compressed)
Size: Discrete 240x320
Interval: Discrete 0.033s (30.000 fps)
2.5 获取一帧数据
v4l2-ctl -d /dev/video0 --set-fmt-video=width=256,height=392,pixelformat=YUYV --stream-mmap --stream-count=1 --stream-to=frame.raw
v4l2-ctl -d /dev/video0 --set-fmt-video=width=256,height=392,pixelformat=MJPG --stream-mmap --stream-count=1 --stream-to=frame.jpg
2.6 设置分辨率
v4l2-ctl -d /dev/video0 --set-fmt-video=width=800,height=600,pixelformat=UYVY