Raspberry Pi 和摄像头模块可通过主板上的 CSI 接口直接连接。还可使用专用的命令应用程序,通过使用命令rpicam-still 来拍照。
不过,这只能在摄像头模块连接到 CSI 时使用,不能与一般的 USB 网络摄像头一起使用。
rpicam-still 命令:
带 CSI 连接的摄像头模块
× 带普通 USB 连接的网络摄像头
那么,通过 USB 连接的网络摄像头应该如何拍照呢?
替代其他软件。
虽然有软件可以使用图形用户界面进行拍照,但我们将向您展示如何使用命令(CUI)进行操作,以便将其纳入您的程序和脚本中。
静态图像和视频分别使用不同的软件。

使用的 Raspberry Pi 是 ComputeModule 5,网络摄像头是罗技 C270n。
C720n 是一款较老的产品,但在撰写本文时仍有售;它最高支持 720P(1280×720)高清画质,并内置麦克风。其图像和音质非常适合视频会议。而且价格合理,是 Raspberry Pi 的理想之选。
现在,我们将带您依次体验拍摄静态图像和录制视频的过程。
使用 fswebcam 拍摄静态图片
网络摄像头拍摄静态图像使用的软件是fswebcam ,Raspberry Pi 官方也介绍了该软件。
使用 apt 安装非常简单。
sudo apt install fswebcam
将用户(此处为 raspida)添加到视频组。将名称替换为当前登录的用户名等,然后读取:
将已登录的用户添加到视频组将使您在运行时不会出现权限错误。
sudo usermod -a -G video raspida
拍摄的基本格式简单如下
fswebcam test.jpg
不过,在未指定任何选项的情况下,默认(标准)分辨率是小分辨率(352×288)。

实际分辨率(352×288)
你可以看到底部有一个细条,右下角有日期和时间。如果文本出现乱码,安装 noto-fonts 可以解决问题。
如果文本乱码,请安装其他字体:
sudo apt install fonts-noto-cjk
有很多选择,但让我们从分辨率开始。更多信息,请参阅fswebcam --help。
-r选项允许指定分辨率。
fswebcam -r 1280x720 test.jpg
接下来是--no-banner选项。
有了这两个选项,我们就能捕捉到非常普通的图像。
fswebcam -r 1280x720 --no-banner ファイル名.jpg

分辨率 1280×720,无横幅
在文件名中注明日期
fswebcam 不提供日期或顺序编号等文件命名功能。官方版本引入了一个 shell 脚本来代替它。
通过执行 shell 脚本,您可以用日期文件名拍照。
说明为三行。在适当位置新建一个 sh 文件,并赋予其执行权限。
nano webcam.sh
chmod +x webcam.sh
sh 的内容是使用 fswebcam 命令,让它以 1280×720 的分辨率拍照,并将保存的文件命名为日期。
#!/bin/bash
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
fswebcam -r 1280x720 --no-banner $DATE.jpg
如果您已移动到与创建的 sh 文件相同的目录,则可以执行以下 shell 命令来拍摄静态图像。
./webcam.sh
这样每次拍摄时都会保存一个带有日期名称的图像文件。
使用 ffmpeg 录制视频
接下来是视频。
可以使用ffmpeg 来代替。
它从一开始就安装在 Raspberry Pi 操作系统上。(version 8:5.1.6-0+deb12u1+rpt3)
使用连接到 Raspberry Pi 的网络摄像头(USB)录制视频时,您将运行带有各种选项的 ffmpeg。
这些选项与 Raspberry Pi 无关,而是与 ffmpeg 和视频格式有关。详情请单独查看 ffmpeg 相关内容。
这次我们使用 C270n,并首先尝试了以下命令选项。
由于摄像机配备了麦克风,因此也会同时录制音频。
最后,输出文件命名为output.mkv 。您可以随意更改文件名。
按终端中的Q停止录音。
ffmpeg -f alsa -i pulse -f v4l2 -input_format mjpeg -i /dev/video0 -c:v copy -c:a aac output.mkv
输入源是音频源。-f alsa -i pulse视频为-f v4l2 -i /dev/video0由
视频格式指定。-input_format mjpeg为 mjpeg 格式,设备编号为/dev/video0在-c:v copy直接从输入源复制视频(无需重新编码)、-c:a aac将音频转换为 AAC 格式,并在最后输入要创建的视频文件的名称。
选项的排列是有顺序的。
基本规则是,它们可以放在输入选项-i 之前或之后。如果出现错误或选项不起作用,请仔细检查插入位置。
以此为基础,我们来指定帧频和屏幕分辨率。
ffmpeg -f alsa -i pulse -f v4l2 -input_format mjpeg -framerate 30 -video_size 800x600 -i /dev/video0 -c:v copy -c:a aac output_800x600.mkv
帧频为 30 帧/秒,-framerate 30,屏幕分辨率为-video_size 800x600,刚刚插入-input_format mjpeg 之后。
H.264 格式 mp4
这样可以减小文件大小。
ffmpeg -f alsa -i pulse -f v4l2 -input_format yuyv422 -framerate 30 -video_size 800x600 -i /dev/video0 -c:v libx264 -vf format=yuv422p -c:a aac output.mp4
即使终端输出也显示它是以 H264、AAC 48 kHz、128 kbps 编码的。
Stream #0:0: Video: h264 (avc1 / 0x31637661), yuv420p(tv, progressive), 800x600, q=2-31, 20 fps, 10240 tbn
Metadata:
encoder : Lavc59.37.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s
最后命令示例
ffmpeg 命令本身有很多选项。你可以改变图像质量、考虑文件大小和其他选项。
由于这与 Raspberry Pi 没有直接关系,我们在此只展示我们使用的选项,但您可以查看 ffmpeg,了解您感兴趣的任何选项。
为了用网络摄像头录制视频,我们最终在网络摄像头连接到 Raspberry Pi 的情况下做了以下操作。
它采用 H264 编码,音频采用 Opus 高质量压缩。一些缩写用于选项。
ffmpeg -f alsa -i pulse -f v4l2 -input_format yuyv422 -r 30 -s 600x360 -i /dev/video0 -c:v libx264 -vf format=yuv422p -c:a libopus -b:a 128k output.mp4
虽然屏幕尺寸较小,但在此设置下,30 秒的视频可容纳约 1.8 MB。
原始视频源被压缩并转换(编码)为 H.264,原始音频被转换为 128 kbps 的 Opus 格式。
Stream #1:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
Stream #0:0 -> #0:1 (pcm_s16le (native) -> opus (libopus))
我不知道如何用不同的网络摄像头来替换它,比如在 ffmpeg 命令中使用的输入源的位置。
因此,掌握网络摄像头的相关信息是个好主意。
要知道如何指定设备和支持的格式,建议您在用 USB 电缆连接网络摄像头后运行几个命令来了解情况。
下面是检查 ffmpeg 命令指定的网络摄像机部分的步骤。
检查网络摄像头的设备信息。
连接网络摄像头后,尝试使用lsusb命令查看信息。
这是 USB 连接设备的常用方法。
lsusb
我是这样在第三行找到网络摄像头 C270 的 ID 的:046d:0825 。
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 003 Device 002: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 1c4f:0027 SiGma Micro USB Keyboard
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
ベンダーID:プロダクトID公司名称以
表示,其他产品则以 Logitech(罗技公司)046d 表示。
查询设备编号
对于 Linux,请查找连接摄像头设备时分配的设备号 (/dev/video*)。
一般来说,如果只连接了一个网络摄像头,则为 video0。
sudo udevadm info --query=all /dev/video1 | grep 'VENDOR_ID\|MODEL_ID\|SERIAL_SHORT'
执行后的信息输出:
E: ID_MODEL_ID=0825
E: ID_SERIAL_SHORT=1811AF40
E: ID_VENDOR_ID=046d
E: ID_USB_MODEL_ID=0825
E: ID_USB_SERIAL_SHORT=1811AF40
E: ID_USB_VENDOR_ID=046d
我们可以看到,之前查询到的供应商 ID 和型号 ID 是相同的。现在我们可以确定视频 0 就是 C720n。
如果是 video1,则 ffmpeg 命令也必须更改。
如果有多个摄像头连接到 Raspberry Pi,请使用以下命令通过供应商 ID 或符号 “USB “来识别它们。
v4l2-ctl --list-devices
UVC Camera (046d:0825) (usb-1000480000.usb-1.4.2):
/dev/video0
/dev/video1
/dev/media3
现在,我们假设网络摄像头通过 USB 电缆连接到 /dev/video0。
了解相机支持的分辨率。
让我们用前面提到的 v4l2-ctl 命令的另一个选项来检查一下。
v4l2-ctl --list-formats
v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'YUYV' (YUYV 4:2:2)
[1]: 'MJPG' (Motion-JPEG, compressed)
此外,带有 “ext “的命令将显示详细信息。
v4l2-ctl --list-formats-ext
'YUYV' (YUYV 4:2:2)
Size: Discrete 640x360
Interval: Discrete 0.033s (30.000 fps)
'MJPG' (Motion-JPEG, compressed)
Size: Discrete 1280x720
Interval: Discrete 0.033s (30.000 fps)
因此,我发现 C270 只支持最大 640×360 或更小的 “YUYV”(YUYV 4:2:2)格式,如果你想要 30 帧率的话。这有点小。
MJPG”(Motion-JPEG,压缩)格式甚至支持 1270x。
还有一点:检查网络摄像头的捕捉格式。
v4l2-ctl --get-fmt-video
Format Video Capture:
Width/Height : 640/360
Pixel Format : 'YUYV' (YUYV 4:2:2)
Field : None
Bytes per Line : 1280
Size Image : 460800
Colorspace : sRGB
Transfer Function : Rec. 709
YCbCr/HSV Encoding: ITU-R 601
Quantization : Default (maps to Limited Range)
Flags :
您还可以更改格式设置。
如果您用命令更改并录制,此内容也应随之更改。
v4l2-ctl 命令有很多选项等。请访问v4l2-ctl --help 查看。
不同网络摄像头的性能不同,因此请在命令中指定摄像头所支持的格式之前检查一下。
我们向您展示了如何使用 Raspberry Pi 通过普通 USB 连接的网络摄像头拍照。
我们使用 fswebcam 捕捉静态图像,使用 ffmpeg 捕捉和录制视频。
如果按命令拍摄,就可以在程序和脚本中使用它;我们可以让网络摄像头以同样的方式工作,也可以让连接到 CSI 的官方摄像头模块工作。
通过 Raspberry Pi 可以对官方相机模块进行更多控制。
,还可以使用专用的命令应用程序,手册可在官方网站上查阅。
However, if you want to use a general-purpose web camera easily, please refer to this issue.
在 Mediainfo 上了解详情
mediainfo我了解到一个名为 “有一个命令行工具和一个图形用户界面版本 “的打包应用程序,它可以方便地获取媒体信息。
由于这些信息是关于您拍摄的视频文件的,因此在您拍摄之前并没有意义,但对于调整选项和比较已保存的视频非常有用。
我往往会忘记指定了哪些选项,因此,在尝试和错误中更改选项以获得更好的图像质量、平衡文件大小等是非常有用的。
sudo apt install mediainfo mediainfo-gui
命令,可以使用 mediainfo 命令 + 文件名来输出。
我指定了一个以电影形式拍摄的文件。你可以看到格式信息和其他详细信息。
mediainfo output.mp4
我用它安装了图形用户界面版本。它已在菜单中注册,只需选择一个视频文件即可使用。

它是一个多平台软件包,因此可在 Windows、macOS 和 Raspberry Pi 操作系统以外的各种 Linux 上运行。
带图形用户界面的网络摄像头

最后,如果你想在 Raspberry Pi 桌面屏幕上使用 USB 连接的网络摄像头,我推荐使用 Guvcview,它与 Raspberry Pi 配合得很好。
apt 软件包很容易安装。
sudo apt install guvcview
如果你想在 Raspberry Pi OS 桌面上使用它,请尝试一次。
文章由拉斯必达提供
非工程师也能愉快使用的 Raspberry Pi 信息网站 raspida.com一个非工程师也能享受和使用的 Raspberry Pi 信息网站。他还为 PiLink 网站提供有关工业用 Raspberry Pi 的技术博客文章。

