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
  1. 不同功能通道

    • video0:主视频流(如MJPG、YUYV格式的实时预览)
    • video1:可能是元数据通道(如时间戳、IMU数据)、静态抓拍通道,或者同一个物理摄像头的另一个实例(例如支持同时输出高低两种分辨率)。
  2. UVC扩展单元 某些UVC摄像头内部有多个逻辑子设备(如视频处理单元、静态图像捕获单元),内核驱动可能为每个子设备单独创建一个/dev/video节点。

  3. /dev/media0

    Media Controller设备节点,用于管理摄像头内部的复杂管线。

    • 作用:当V4L2设备内部有多个模块(如传感器、ISP、缩放器)时,/dev/media0允许用户空间程序查看和配置这些模块之间的连接关系(称为“pipeline”)。
    • 典型场景:UVC摄像头如果实现了媒体控制器API,你会看到这个节点。它本身不直接传输视频,而是通过media-ctl工具来配置内部路由,然后再通过/dev/video0采集数据。

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