视频节点与媒体子系统基础

Linux 媒体子系统中,摄像头链路通常拆解为数据流接口、拓扑结构管理以及底层硬件配置三层。

核心节点角色划分

  • /dev/videoX图像数据传输通路。应用程序通过标准 V4L2 接口向其请求缓冲区并抓取/推送视频帧。
  • /dev/mediaX硬件媒体拓扑框架。用于描述 Sensor、MIPI CSI、ISP、Scaler 等硬件模块间的连接链路与路由状态。
  • /dev/subdevX硬件单元细粒度控制接口。用于独立配置 Sensor 曝光增益、MIPI D-PHY 格式、ISP 裁剪缩放、消隐与输出分辨率。

一句话总结video 用来取图像,media 用来看链路,subdev 用来调参数。

常用调试命令速查

1. 设备枚举与信息查询

# 列出当前系统中所有注册的 V4L2 视频设备
v4l2-ctl --list-devices

# 查看某个节点在内核 video4linux 类中的真实注册名称
cat /sys/class/video4linux/video41/name

# 查看节点驱动信息与硬件类型
v4l2-ctl -d /dev/video23 -D

2. 查看拓扑与子设备状态

# 打印 media 控制器的完整实体与管道链路拓扑
media-ctl -d /dev/media1 -p

# 查看 subdev 对应 Pad 的图像格式
v4l2-ctl -d /dev/v4l-subdev4 --get-subdev-fmt 0

# 查看 subdev 当前输出帧率
v4l2-ctl -d /dev/v4l-subdev4 --get-subdev-fps 0

3. 格式协商与帧采集

# 列出 video 节点支持的所有像素格式与分辨率
v4l2-ctl -d /dev/video1 --list-formats-ext

# 读取当前视频流的输出格式
v4l2-ctl -d /dev/video23 --get-fmt-video

# 设置视频采集格式与分辨率
v4l2-ctl -d /dev/video1 --set-fmt-video=width=3840,height=2160,pixelformat=NV12

# 抓取 YUV 裸流文件(使用 mmap 申请 4 个 Buffer,采集 10 帧自动停止)
v4l2-ctl -d /dev/video1 --stream-mmap=4 --stream-count=10 --stream-to=/tmp/test_cam.yuv

视频节点完整溯源分析法

当面对复杂的嵌入式 SoC 图像流水线(如 Rockchip 平台)时,可以利用 media-ctl 逆向推导图像流经过的完整硬件链路。

步骤一:查询节点的所属模块与 Card Type

v4l2-ctl -d /dev/video23 -D

输出示例:

Driver Info:
        Driver name      : rkvpss_v2
        Card type        : rkvpss_scale1
        Bus info          : platform:rkvpss-vir0
        Driver version   : 6.1.157

Card type 字段可以确定该节点对应的硬件/软件逻辑模块为 rkvpss_scale1

步骤二:在媒体拓扑中定位 Entity

利用 media-ctl 检索对应控制器的拓扑结构:

media-ctl -d /dev/media3 -p

检索并匹配 rkvpss_scale1

- entity 8: rkvpss_scale1 (1 pad, 1 link)
            type Node subtype V4L flags 0
            device node name /dev/video23
        pad0: Sink
                <- "rkvpss-subdev":1 [ENABLED]

由上述拓扑可知:/dev/video23 对应实体 rkvpss_scale1pad0 (Sink),它的上游输入来自于 "rkvpss-subdev":1

步骤三:逆向追溯上游模块

继续在拓扑中检索 "rkvpss-subdev" 的输入来源:

- entity 28: rkisp-vir0-sditf (1 pad, 1 link)
             type V4L2 subdev subtype Unknown flags 0
             device node name /dev/v4l-subdev1
        pad0: Source
                [fmt:YUYV8_2X8/3840x2160 field:none colorspace:smpte170m quantization:lim-range]
                -> "rkvpss-subdev":0 [ENABLED]

可以看到数据流由 rkisp-vir0-sditf(ISP 虚拟缩放/输出接口)流向了 rkvpss-subdev

当前建立的数据流拓扑片段:

rkisp-vir0-sditf (/dev/v4l-subdev1)
  -> rkvpss-subdev
    -> rkvpss_scale1 (/dev/video23)

步骤四:跨媒体控制器遍历整条管道

如果 rkisp-vir0-sditf 是链路前端或虚拟节点,可以依次检查系统中的其他 media 控制器(如 /dev/media0/dev/media1/dev/media2),顺着 Link 标志继续向上寻找 Sensor(如 imx415 / sc3336)及 MIPI CSI-2 D-PHY 控制器,最终还原整个摄像头硬件采集管道。