v4l2-ctl
是 Linux 下调试、配置视频设备(特别是摄像头)非常常用的命令行工具,它来自 v4l-utils 包。下面详细讲讲它的用法、常用选项、例子和注意事项。
🚀 v4l2-ctl
是什么
- 全名:Video4Linux2 Control
- 用途:查询设备信息、设置参数(分辨率、帧率、曝光等)、抓取图像帧
- 适用对象:V4L2 兼容的视频设备,例如 USB UVC 摄像头、CSI 摄像头模块等。
🛠 安装
Debian/Ubuntu:
sudo apt update
sudo apt install v4l-utils
其他发行版:
sudo dnf install v4l-utils # Fedora
sudo pacman -S v4l-utils # Arch
🔍 基本用法
1️⃣ 列出所有视频设备
v4l2-ctl --list-devices
输出示例:
Logitech HD Webcam C270 (usb-0000:00:14.0-6):
/dev/video0
/dev/video1
2️⃣ 查看设备支持的格式、分辨率
v4l2-ctl --device=/dev/video0 --list-formats-ext
输出示例:
[0]: 'MJPG' (Motion-JPEG)
Size: Discrete 1280x720
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 640x480
Interval: Discrete 0.033s (30.000 fps)
说明支持 MJPEG 编码,分辨率和帧率如上。
3️⃣ 查询当前设置
v4l2-ctl --device=/dev/video0 --all
输出会包含:
- 驱动名、设备能力
- 当前分辨率、像素格式
- 亮度、对比度、曝光等参数
4️⃣ 设置参数
✅ 分辨率、帧率:
v4l2-ctl --device=/dev/video0 --set-fmt-video=width=640,height=480,pixelformat=MJPG
v4l2-ctl --device=/dev/video0 --set-parm=30
✅ 曝光(假设摄像头支持):
v4l2-ctl --set-ctrl=exposure_auto=1 # 关闭自动曝光
v4l2-ctl --set-ctrl=exposure_absolute=100
✅ 调整亮度、对比度等:
v4l2-ctl --set-ctrl=brightness=128
v4l2-ctl --set-ctrl=contrast=32
5️⃣ 捕获一帧图像
v4l2-ctl --device=/dev/video0 --set-fmt-video=width=640,height=480 --stream-mmap --stream-count=1 --stream-to=frame.jpg
💡 输出图像文件 frame.jpg
。
6️⃣ 连续抓帧(调试用)
v4l2-ctl --device=/dev/video0 --stream-mmap --stream-count=100 --stream-to=video.raw
这会抓取 100 帧视频数据(裸流格式)。
🎨 常用选项清单
选项 | 含义 |
---|---|
--list-devices | 列出视频设备及节点 |
--list-formats / --list-formats-ext | 列出支持的视频格式和分辨率 |
--all | 显示设备全部信息 |
--set-fmt-video | 设置视频格式(分辨率、像素格式) |
--get-fmt-video | 查看当前视频格式 |
--set-parm | 设置帧率 |
--get-parm | 查看帧率 |
--get-ctrl / --set-ctrl | 获取或设置控制参数(亮度、曝光等) |
--stream-mmap | 使用内存映射方式抓帧 |
--stream-to=文件名 | 抓帧数据保存到文件 |
--stream-count=N | 抓取 N 帧 |
⚠️ 注意事项
-
并非所有摄像头支持所有控制参数,
--list-ctrls
可以查看支持的参数。v4l2-ctl --list-ctrls
-
如果摄像头只有 YUYV 格式,抓取的图像可能要用工具转换(如
ffmpeg
)。 -
USB 带宽和供电不足会导致高分辨率高帧率设置无效。
🌟 一个完整例子
假如你有一个摄像头 /dev/video0
,想:
- 设置 1280x720,MJPEG,30fps
- 关闭自动曝光,设置固定曝光值
- 抓一帧保存
可以这样:
v4l2-ctl --device=/dev/video0 --set-fmt-video=width=1280,height=720,pixelformat=MJPG
v4l2-ctl --device=/dev/video0 --set-parm=30
v4l2-ctl --set-ctrl=exposure_auto=1
v4l2-ctl --set-ctrl=exposure_absolute=200
v4l2-ctl --stream-mmap --stream-count=1 --stream-to=frame.jpg
💡 小技巧
-
配合
ffplay
实时预览:ffplay /dev/video0
-
自动化脚本里可以先用
v4l2-ctl
设置参数,再启动视频采集程序。