在 Linux 桌面环境之外,直接用命令行控制和查看 USB 摄像头是一种非常高效、可控且可自动化的方式。无论是用于测试硬件、搭建服务器视频流、远程监控,还是排查驱动问题,V4L2 + FFmpeg 体系都是最稳定可靠的方案之一。
本文将完整介绍如何在 Linux 下,用命令行列出摄像头、识别正确设备,并以最佳参数输出画面。
一、Linux 摄像头的基本结构
Linux 中所有视频采集设备都通过 V4L2(Video4Linux2) 暴露为:
/dev/video0
/dev/video1
/dev/video2
...
一个物理摄像头通常会暴露 两个或多个 video 节点:
- 一个是 主视频流
- 另一个是 副流 / 元数据流 / 低分辨率流
如果选错节点,画面可能会黑屏、只有低分辨率,或者无法打开。
二、列出系统中所有摄像头
首先查看当前存在的 video 设备:
ls -l /dev/video*
然后用 V4L2 查询设备归属:
v4l2-ctl --list-devices
示例输出结构如下:
USB Camera A:
/dev/video5
/dev/video6
/dev/media2
USB Camera B:
/dev/video2
/dev/video3
/dev/media1
Built-in Camera:
/dev/video0
/dev/video1
/dev/media0
同一组下面的两个 /dev/videoX 就属于同一个物理摄像头,其中 第一个通常是主视频流。
三、查看摄像头支持的格式和分辨率
确定主设备后(例如 /dev/video5),查询它的能力:
v4l2-ctl -d /dev/video5 --list-formats-ext
通常可以看到类似:
' MJPG' (Motion-JPEG)
2560x1440 @ 30fps
1920x1080 @ 30fps
1280x720 @ 60fps
' YUYV'
2560x1440 @ 5fps
1920x1080 @ 10fps
这里可以看出一个关键事实:
MJPG 才是高分辨率高帧率的正确模式
YUYV 在高分辨率下通常帧率极低
四、用 ffplay 直接显示画面
推荐使用 FFmpeg 自带的 ffplay:
2K(2560×1440 @ 30fps)
ffplay -f v4l2 -input_format mjpeg -video_size 2560x1440 -framerate 30 -i /dev/video5
1080p(性能更稳)
ffplay -f v4l2 -input_format mjpeg -video_size 1920x1080 -framerate 30 -i /dev/video5
720p 60fps(画面更顺滑)
ffplay -f v4l2 -input_format mjpeg -video_size 1280x720 -framerate 60 -i /dev/video5
如果不显式指定 -input_format mjpeg,很多 USB 摄像头会默认进入 YUYV 模式,导致高分辨率下帧率极低甚至黑屏。
五、截图
ffmpeg -f v4l2 -input_format mjpeg -video_size 2560x1440 -i /dev/video5 -frames:v 1 snapshot.jpg
六、录像
ffmpeg -f v4l2 -input_format mjpeg -video_size 2560x1440 -framerate 30 \
-i /dev/video5 -c:v libx264 -preset veryfast -crf 23 record.mp4
按 q 结束录制。
七、避免设备编号变化(强烈推荐)
/dev/video5 这样的编号在每次插拔 USB 时可能会改变。
Linux 提供了 稳定路径:
ls -l /dev/v4l/by-id/
会看到类似:
usb-XXXX_Camera-video-index0
usb-XXXX_Camera-video-index1
其中:
video-index0= 主视频流video-index1= 副流
以后建议始终使用:
/dev/v4l/by-id/xxx-video-index0
例如:
ffplay -f v4l2 -input_format mjpeg -video_size 2560x1440 -framerate 30 \
-i /dev/v4l/by-id/usb-XXXX-video-index0
这样无论设备如何重新枚举,都不会选错摄像头。
八、总结
在 Linux 下,USB 摄像头的最佳实践是:
- 使用
v4l2-ctl精确识别设备 - 使用 MJPEG 而不是 YUYV
- 明确指定分辨率和帧率
- 用
/dev/v4l/by-id/固定设备路径
这一套组合可以实现:
- 零 GUI 依赖
- 极高稳定性
- 可用于服务器、容器、自动化、OBS、Jitsi、RTSP 等任何场景
命令行控制摄像头,比桌面工具更可靠、更透明,也更适合长期运行的系统环境。