以最小的延迟从 shell 拍摄网络摄像头图片

x-r*_*ray 5 linux webcam ffmpeg

我正在寻找一种命令行工具,它可以尽可能快地从网络摄像头拍摄照片并将其写入标准输出。此外,我希望能够指定输入格式、分辨率和输出格式等设置。

我的第一次尝试是 ffmpeg:

ffmpeg -f video4linux2 -video_size 1920x1080 -input_format yuyv422 -i /dev/video0 -f image2 -frames:v 1 -qscale:v 2 pipe:1
Run Code Online (Sandbox Code Playgroud)

但是,这有两个缺点:

  1. 将图像写入stdout大约需要3秒钟,这似乎是由于网络摄像头需要初始化的时间。

  2. 以这种方式拍摄的照片相当暗,可能是网络摄像头需要捕获视图视频帧以调整亮度等。

我的下一个想法是从网络摄像头连续捕获视频帧(即“保持网络摄像头处于活动状态”),将这些视频帧流式传输到某处,然后抓取单个视频帧并按需将它们转换为图像。但是,我不知道该怎么做(以及是否有更好的方法)。

编辑:我需要一个一次性命令将图像写入标准输出,所以我可以在 http 服务器中使用它来提供 http GET 请求。它需要快速,因为拍照会阻塞机器中的机械过程。

dir*_*rkt 5

对于我的网络摄像头,fswebcam不到半秒即可拍摄一张照片:

$ time fswebcam test1.jpg
...
real    0m0.491s
user    0m0.024s
sys     0m0.000s
Run Code Online (Sandbox Code Playgroud)

写入标准输出然后保存需要更长的时间:

$ time fswebcam - > test2.jpg
...
real    0m0.538s
user    0m0.029s
sys     0m0.000s
Run Code Online (Sandbox Code Playgroud)

您还可以每n秒拍摄一次图像( --loop n),如果这是您所需要的(您没有解释为什么您希望它尽可能快,以及循环是否或如何提供帮助)。

您可以使用 所示的控件使图像变亮或调整对比度等fswebcam --list-controls