视频节点与媒体子系统基础
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_scale1 的 pad0 (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 控制器,最终还原整个摄像头硬件采集管道。