在 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 等任何场景

命令行控制摄像头,比桌面工具更可靠、更透明,也更适合长期运行的系统环境。

Leave a Reply

Your email address will not be published. Required fields are marked *