摄像头软件
本文档介绍如何将支持的摄像头模块与我们的软件工具配合使用。所有 Raspberry Pi 摄像头都可以使用我们的软件工具录制高分辨率照片和全高清 1080p 视频(或更好)。
Raspberry Pi 生产多种官方 摄像头模块,包括
- 最初的 500 万像素摄像头模块 1(已停产)
- 800 万像素 摄像头模块 2,带或不带红外滤镜
- 1200 万像素 摄像头模块 3,有标准镜头和广角镜头,带或不带红外滤光镜
- 1200 万像素的 高质量摄像头,配有 CS 和 M12 卡口,可与外置镜头配合使用
- 160 万像素 全局快门摄像头,用于快速动态摄影
- 1200 万像素的 AI摄像头,使用索尼IMX500成像传感器,为任何摄像头应用提供低延迟、高性能的AI功能
有关摄像机硬件的更多信息,请参阅摄像头硬件文档。
首先,安装摄像头模块。然后,按照本节中的指南使用你的摄像头模块。
本指南不再涵盖在 Bullseye 和早期 Raspberry Pi OS 版本中可用的传统相机栈。传统的相机栈使用 raspivid、raspistill 等应用程序和原始的 Picamera(而不是 Picamera2)Python 库,多年来已被弃用,现在已不再支持。如果您使用的是传统的相机栈,它将只支持 摄像头模块 1、摄像头模块 2 和 高质量摄像头,而不会支持任何更新的相机模块。
rpicam-apps
从 Raspberry Pi OS Bookworm 版本开始,相机捕获应用程序的名称均为 rpicam-*。
Raspberry Pi 提供了一组简短的 rpicam-apps 示例。这些基于 libcamera 构建的命令行应用程序,可从相机捕获图像和视频。
这些应用程序包括:
rpicam-hello: 相当于摄像头的 "hello world",可启动摄像头预览流并显示在屏幕上。rpicam-jpeg: 运行预览窗口,然后捕捉高分辨率静态图像。rpicam-still: 模拟原始raspistill应用程序的许多功能。rpicam-vid: 捕捉视频。rpicam-raw: 直接从传感器捕捉原始(未经处理的拜尔)帧。rpicam-detect: 默认不内置,但如果用户在 Raspberry Pi 上安装了 TensorFlow Lite,则可以内置。在检测到特定物体时捕获 JPEG 图像。
Raspberry Pi OS 包含五个基本的 rpicam-apps,因此即使在刚安装好的 Raspberry Pi OS 系统上,您也可以使用摄像头拍摄图片和视频。
您可以创建基于 rpicam 的自定义应用程序,以满足您的特定需求。rpicam-apps 源代码 根据 BSD-2-Clause 许可证免费提供。
libcamera
libcamera 是一个开源软件库,目的是在 Arm 处理器上直接从 Linux 操作系统支持摄像头系统。在 Broadcom GPU 上运行的专有代码被最小化。有关 libcamera 的更多信息,请参阅 libcamera网站。
libcamera 提供了一个 C++ API 配置摄像头,然后允许应用程序请求图像帧。这些图像缓冲区位于系统内存中,可直接传递给静态图像编码器(如 JPEG)或视频编码器(如 h.264)。libcamera 本身并不编码或显 示图像:该功能请使用 rpicam-apps。
您可以在 libcamera 官方资源库中找到源代码。Raspberry Pi OS 发行版使用 fork 来控制更新。
在 libcamera 核心之下,我们提供了一个自定义管道处理程序。libcamera 使用这一层来驱动 Raspberry Pi 上的传感器和图像信号处理器(ISP)。libcamera 包含一系列图像处理算法(IPA),包括自动曝光/增益控制(AEC/AGC)、自动白平衡(AWB)和自动镜头阴影校正(ALSC)。
Raspberry Pi 的 libcamera 支持以下摄像头:
- 官方摄像头:
- OV5647 (V1)
- IMX219 (V2)
- IMX708 (V3)
- IMX477 (HQ)
- IMX500 (AI)
- IMX296 (GS)
- 第三方传感器:
- IMX290
- IMX327
- IMX378
- IMX519
- OV9281
要扩展对新传感器的支持,请查看为 libcamera 做贡献。
rpicam-hello
rpicam-hello 会短暂显示一个预览窗口,其中包含所连接摄像头的视频画面。要使用 rpicam-hello 显示五秒钟的预览窗口,请在终端中运行以下命令:
rpicam-hello
您可以使用 timeout 选项传递一个可选的持续时间(以毫秒为单位)。值为 0 时,预览将无限期运行:
rpicam-hello --timeout 0
使用终端中的 Ctrl+C 或预览窗口上的关闭按钮停止 rpicam-hello。
显示图像传感器预览
大多数 rpicam-app 都会在窗口中显示预览图像。如果没有活动的桌面环境,预览图像会使用 Linux 直接渲染管理器 (DRM) 直接绘制到显示器上。否则,rpicam-apps 会尝试使用桌面环境。这两种路径都使用零拷贝 GPU 缓冲区共享:因此不支持 X 转发。
如果运行 X 窗口服务器并希望使用 X 转发,请使用 qt-preview 标志在 Qt窗口中呈现预览窗口。Qt 预览窗口比其他预览窗口占用更多资源。
使用 Gtk2 的旧系统在与 OpenCV 链接时可能会产生 Glib-GObject 错误,无法显示 Qt 预览窗口。在这种情况下,以 root 用户身份编辑文件 /etc/xdg/qt5ct/qt5ct.conf,将包含 style=gtk2 的行替换为 style=gtk3。
要完全禁止预览窗口,请使用 nopreview 标志:
rpicam-hello -n
info-text 选项使 用 % 指令在窗口标题栏上显示图像信息。例如,以下命令显示当前的红色和蓝色增益值:
rpicam-hello --info-text "red gain %rg, blue gain %bg"
有关指令的完整列表,请参阅 info-text 参考资料。
rpicam-jpeg
rpicam-jpeg 可以帮助你捕捉 Raspberry Pi 设备上的图像。
要捕获全分辨率的 JPEG 图像并将其保存到名为 test.jpg 的文件中,请运行以下命令:
rpicam-jpeg --output test.jpg
你会看到一个五秒钟的预览窗口。然后,rpicam-jpeg 会捕获全分辨率的 JPEG 图像并保存。
使用 timeout 选项可更改预览窗口的显示时间。width 和height选项可改变保存图像的分辨率。例如,以下命令显示预览窗口 2 秒钟,然后捕捉并保存分辨率为 640×480 像素的图像:
rpicam-jpeg --output test.jpg --timeout 2000 --width 640 --height 480
rpicam-still
和 rpicam-jpeg 一样,rpicam-still 可以帮助你在 Raspberry Pi 设备上捕捉图像。
与 rpicam-jpeg 不同,rpicam-still 支持传统的 raspistill 应用程序中提供的许多选项。
要捕获全分辨率的 JPEG 图像并将其保存到名为 test.jpg 的文件中,请运行以下命令:
rpicam-still --output test.jpg
编码器
rpicam-still 可以保存多种格式的图像,包括png、bmp以及 RGB 和 YUV 二进制像素转储。要读取这些二进制转储,任何读取文件的应用程序都必须理解像素排列。
使用 encoding 选项指定输出格式。传递给 output 的文件名对输出文件类型没有影响。
要捕捉全分辨率 PNG 图像并将其保存到名为 test.png 的文件中,请运行以下命令:
rpicam-still --encoding png --output test.png
有关指定图像格式的更多信息,请参阅 encoding选项参考。
捕捉原始图像
原始图像是由图像传感器直接生成的图像,图像信号处理器(ISP)或中央处理器尚未对其进行任何处理。彩色图像传感器通常使用 Bayer 格式。使用 raw 选项捕捉原始图像。
要捕捉图像并将其保存到名为 test.jpg 的文件中,同时将图像的原始版本保存到名为 test.dng 的文件中,请运行以下命令:
rpicam-still --raw --output test.jpg
rpicam-still 以 DNG(Adobe Digital Negative,Adobe 数字负片)格式保存原始图像。要确定原始图像的文件名,rpicam-still 使用与输出文件相同的名称,但扩展名改为.dng。要处理 DNG 图像,请使用 Dcraw 或 RawTherapee 等应用程序。
DNG 文件包含图像拍摄的元数据,包括黑电平、白平衡信息和 ISP 用于生成 JPEG 的色彩矩阵。使用 ExifTool 查看 DNG 元数据。以下输出显示了存储在 Raspberry Pi 使用 HQ 摄像机拍摄的原始图像中的典型元数据:
File Name : test.dng
Directory : .
File Size : 24 MB
File Modification Date/Time : 2021:08:17 16:36:18+01:00
File Access Date/Time : 2021:08:17 16:36:18+01:00
File Inode Change Date/Time : 2021:08:17 16:36:18+01:00
File Permissions : rw-r--r--
File Type : DNG
File Type Extension : dng
MIME Type : image/x-adobe-dng
Exif Byte Order : Little-endian (Intel, II)
Make : Raspberry Pi
Camera Model Name : /base/soc/i2c0mux/i2c@1/imx477@1a
Orientation : Horizontal (normal)
Software : rpicam-still
Subfile Type : Full-resolution Image
Image Width : 4056
Image Height : 3040
Bits Per Sample : 16
Compression : Uncompressed
Photometric Interpretation : Color Filter Array
Samples Per Pixel : 1
Planar Configuration : Chunky
CFA Repeat Pattern Dim : 2 2
CFA Pattern 2 : 2 1 1 0
Black Level Repeat Dim : 2 2
Black Level : 256 256 256 256
White Level : 4095
DNG Version : 1.1.0.0
DNG Backward Version : 1.0.0.0
Unique Camera Model : /base/soc/i2c0mux/i2c@1/imx477@1a
Color Matrix 1 : 0.8545269369 -0.2382823821 -0.09044229197 -0.1890484985 1.063961506 0.1062747385 -0.01334283455 0.1440163847 0.2593136724
As Shot Neutral : 0.4754476844 1 0.413686484
Calibration Illuminant 1 : D65
Strip Offsets : 0
Strip Byte Counts : 0
Exposure Time : 1/20
ISO : 400
CFA Pattern : [Blue,Green][Green,Red]
Image Size : 4056x3040
Megapixels : 12.3
Shutter Speed : 1/20
要计算模拟增益,请用 ISO 数字除以 100。
自动白平衡 (AWB) 算法会确定一个单一的校准光源,并始终标为 D65。
捕捉长时间曝光
要拍摄长时间曝光的图像,请禁用自动曝光/增益控制 (AEC/AGC) 和自动白平衡 (AWB)。否则,这些算法将迫使用户在收敛时等待若干帧。
要禁用这些算法,请为增益和 AWB 提供明确的值。由于长时间曝光已经耗费了大量时间,使用 immediate 选项完全跳过预览阶段通常是合理的。
要执行 100 秒曝光捕捉,请运行以下命令:
rpicam-still -o long_exposure.jpg --shutter 100000000 --gain 1 --awbgains 1,1 --immediate
要查找 Raspberry Pi 官方摄像头的最大曝光时间,请参阅 摄像头硬件规格。
创建延时视频
要创建延时视频,可定期捕捉静态图像,例如每分钟捕捉一次,然后使用应用程序将图片拼接成视频。
- rpicam-still 延时模式
- cron
要使用 rpicam-still 的内置延时模式,请使用 timelapse 选项。该选项接受一个值,代表你希望 Raspberry Pi 在两次捕捉之间等待的时间,单位为毫秒。
首先,创建一个存放延时照片的目录:
mkdir timelapse
运行以下命令创建 30 秒的延时,每两秒记录一张照片,将输出保存到 image0001.jpg 至 image0013.jpg 中:
rpicam-still --timeout 30000 --timelapse 2000 -o timelapse/image%04d.jpg
您还可以使用 cron 自动执行延时。首先,创建名为 timelapse.sh 的脚本,其中包含以下命令。将<username>占位符替换为 Raspberry Pi 上的用户账户名:
#!/bin/bash
DATE=$(date +"%Y-%m-%d_%H%M")
rpicam-still -o /home/<username>/timelapse/$DATE.jpg
然后,使脚本可执行:
chmod +x timelapse.sh
创建 timelapse 目录,保存延时摄影图片:
mkdir timelapse
打开 crontab 进行编辑:
crontab -e
在编辑器中打开该文件后,添加以下行以计划每分钟捕获一次图像,用主用户账户的用户名替换占位符 <username>:
* * * * /home/<username>/timelapse.sh 2>&1
保存并退出后,您将看到以下信息:
crontab: installing new crontab
要停止为延时拍摄图像,请从 crontab 中删除上述行。
将图像拼接在一起
有了一系列延时照片后,您可能想将它们合成一段视频。在 Raspberry Pi 上使用 ffmpeg 可以做到这一点。
首先,安装 ffmpeg:
sudo apt install ffmpeg
在 crontimelapse 目录下运行以下命令,将 JPEG 文件转换为 mp4 视频:
ffmpeg -r 10 -f image2 -pattern_type glob -i 'timelapse/*.jpg' -s 1280x720 -vcodec libx264 timelapse.mp4
上述命令使用以下参数:
-r 10:将输出视频的帧频(赫兹值)设置为每秒十帧-f image2:设置ffmpeg从模式指定的图像文件列表中读取文件-pattern_type glob: 使用通配符模式(globbing)来解释用-i输入的文件名-i 'timelapse/*.jpg': 指定输入文件与timelapse目录中的 JPG 文件匹配-s 1280x720:缩放至 720p-vcodec libx264使用软件 x264 编码器。timelapse.mp4输出视频文件的名称。
有关 ffmpeg 选项的更多信息,请在终端运行 ffmpeg --help。
rpicam-vid
rpicam-vid 可以帮助你在 Raspberry Pi 设备上捕获视频。rpicam-vid 会显示一个预览窗口,并将编码后的比特流写入指定输出。这将产生一个未打包的视频比特流,它未被任何容器(如 mp4 文件)格式包裹。
如果可用,rpicam-vid 会使用硬件 H.264 编码。
例如,以下命令将一段 10 秒钟的视频写入名为 test.h264 的文件:
rpicam-vid -t 10s -o test.h264
您可以用 ffplay 和其他视频播放器播放生成的文件:
ffplay test.h264
旧版本的 vlc 可以正确播放 H.264 文件,但最近的版本却不行,只能显示几帧,甚至可能是乱码。您应使用不同的媒体播放器,或将文件保存为更广泛支持的容器格式,如 MP4(见下文)。
在 Raspberry Pi 5 上,您可以为输出文件指定 mp4 文件扩展名,直接输出为 MP4 容器格式:
rpicam-vid -t 10s -o test.mp4
在 Raspberry Pi 4 或更早的型号上,你可以用下面命令保存为 MP4 文件:
rpicam-vid -t 10s --codec libav -o test.mp4
编码器
rpicam-vid 支持动态 JPEG 以及未压缩和未格式化的 YUV420:
rpicam-vid -t 10000 --codec mjpeg -o test.mjpeg
rpicam-vid -t 10000 --codec yuv420 -o test.data
codec 选项决定输出格式,而不是输出文件的扩展名。
segment 选项会将输出文件分割成不同大小的片段(以毫秒为单位)。通过指定非常短(1 毫秒)的片段,可以方便地将动态 JPEG 流分解为单个 JPEG 文件。例如,以下命令将 1 毫秒的片段与输出文件名中的计数器相结合,为每个片段生成一个新的文件名:
rpicam-vid -t 10000 --codec mjpeg --segment 1 -o test%05d.jpeg
捕捉高帧率视频
要尽量减少高帧率(> 60fps)视频的丢帧,请尝试以下配置调整:
- 使用
--level 4.2将 H.264 target level 设置为 4.2。 - 将
denoise选项设置为cdn_off,禁用软件色彩去噪处理。 - 使用
nopreview禁用显示窗口,以释放一些额外的 CPU 周期。 - 在
/boot/firmware/config.txt中设置force_turbo=1,以确保在视频捕获过程中 CPU 时钟不会节流。更多信息,请参阅force_turbo文档。 - 使用
--width 1280 --height 720或更低的分辨率调整 ISP 输出分辨率,以实现帧速率目标。 - 在 Raspberry Pi 4 上,可以通过在
/boot/firmware/config.txt中添加gpu_freq=550或更高值来超频 GPU 以提高性能。更多详情,请参阅 超频文档。
以下命令演示了如何实现 1280×720 120fps 视频:
rpicam-vid --level 4.2 --framerate 120 --width 1280 --height 720 --save-pts timestamp.pts -o video.264 -t 10000 --denoise cdn_off -n
libav 与 rpicam-vid 的集成
rpicam-vid 可以使用 ffmpeg/libav 后端编解码器对音频和视频流进行编码。您既可以将这些流保存到文件中,也可以通过网络进行流式传输。如果存在,libav 会使用硬件 H.264 视频编码。
要启用 libav 后端,在 codec 选项中加入 libav 值。
rpicam-vid --codec libav --libav-format avi --libav-audio --output example.avi
在 Pi 5 实现低延迟视频
Pi 5 使用软件视频编码器。与旧式硬件编码器相比,这些编码器输出帧的延迟时间通常较长,这有时会成为实时流媒体应用的一个问题。
在这种情况下,请在 rpicam-vid 命令中添加 --low-latency 选项。这将改变某些编码器选项,以更快地输出编码帧。
这样做的缺点是编码效率会(略微)降低,处理器多核的使用效率也可能(略微)降低。可编码的最大帧频可能会 略有降低(但仍能轻松达到 1080p30)。
rpicam-raw
rpicam-raw 直接从传感器以原始贝叶帧的形式记录视频。它不会显示预览窗口。要将两秒钟的原始片段录制到名为 test.raw 的文件中,请运行以下命令:
rpicam-raw -t 2000 -o test.raw
rpicam-raw 直接输出没有任何格式信息的原始帧。应用程序会将像素格式和图像尺寸打印到终端窗口,以帮助用户解释像素数据。
默认情况下,rpicam-raw 会将原始图像输出到一个可能非常大的文件中。使用 %05d directive 选项将每个原始图像帧引导到单独的文件中,使每个图像帧的文件名都是唯一的:
rpicam-raw -t 2000 --segment 1 -o test%05d.raw
如果使用快速存储设备,rpicam-raw 能以 10fps 的速度将 18MB 的 1200 万像素 HQ 相机帧写入磁盘。rpicam-raw 无法将输出帧格式化为 DNG 文件;如需该功能,请使用 rpicam-still。使用低于 Class10 的 framerate 选项可避免丢帧:
rpicam-raw -t 5000 --width 4056 --height 3040 -o test.raw --framerate 8
有关原始格式的更多信息,请参阅 mode 文档。
rpicam-detect
Raspberry Pi OS 不包含 rpicam-detect。不过,如果你安装了 安装 TensorFlow Lite,就可以构建 rpicam-detect。有关详细信息,请参阅 rpicam-apps构建说明。运行 meson 时不要忘记传递 -Denable_tflite=enabled。
rpicam-detect 会显示一个预览窗口,并使用经过训练的 Google MobileNet v1 SSD(单次检测器)神经网络监控内容,该网络可使用 Coco 数据集识别约 80 类对象。rpicam-detect 能识别人、车、猫和许多其他物体。
每当 rpicam-detect 检测到目标对象时,它就会捕获一张全分辨率的 JPEG 文件。然后返回监控预览模式。
有关模型使用的一般信息,请参阅 TensorFlow Lite 对象检测器 部分。例如,您可以在外出时偷偷监视您的猫:
rpicam-detect -t 0 -o cat%04d.jpg --lores-width 400 --lores-height 300 --post-process-file object_detect_tf.json --object cat
配置
大多数用例都能自动运行,无需更改摄像头配置。不过,有些常见的使用情况确实需要对配置进行调整,其中包括
- 第三方摄像头(制造商说明应解释必要的配置更改(如有)
- 将非标准驱动程序或覆盖层与正式的 Raspberry Pi 摄像头一起使用
Raspberry Pi OS 可在 /boot/firmware/config.txt 中识别以下覆盖层。
| 摄像头模块 | 在 /boot/firmware/config.txt 中设置 |
|---|---|
| V1 摄像头 (OV5647) | dtoverlay=ov5647 |
| V2 摄像头(IMX219) | dtoverlay=imx219 |
| HQ 摄像头 (IMX477) | dtoverlay=imx477 |
| GS 摄像头 (IMX296) | dtoverlay=imx296 |
| 摄像头模块 3 (IMX708) | dtoverlay=imx708 |
| IMX290 和 IMX327 | dtoverlay=imx290,clock-frequency=74250000 或 dtoverlay=imx290,clock-frequency=37125000(这两个模块共享 imx290 内核驱动程序;有关正确频率,请参阅模块供应商的说明) |
| IMX378 | dtoverlay=imx378 |
| OV9281 | dtoverlay=ov9281 |
要使用这些覆盖层之一,必须禁用摄像头自动检测功能。要禁用自动检测,请在 /boot/firmware/config.txt 中设置 camera_auto_detect=0。如果 config.txt 中已经有一行指定了 camera_auto_detect 值,请将该值改为 0。使用 sudo reboot 重启 Raspberry Pi,加载所作更改。
如果您的 Raspberry Pi 有两个摄像头连接器(例如 Raspberry Pi 5 或其中一个计算模块),那么您可以在上表中使用的 dtoverlay 中添加 ,cam0,指定使用摄像头连接器 0。如果不添加,将默认检查摄像头连接器 1。请注意,对于连接到 SBC(非计算模块)的 Raspberry Pi 官方摄像头模块,自动检测将正确识别连接到设备的所有摄像头。
使用调谐文件调整摄像头行为
Raspberry Pi 的 libcamera 实现为每个摄像头都包含一个调谐文件。该文件控制算法和硬件,以生成最佳图像质量。libcamera 只能确定使用的传感器,而不能确定模块。因此,某些模块需要覆盖调校文件。tuning-file 选项指定覆盖。您也可以复制和更改现有的调谐文件来定制摄像机的行为。
例如,无红外滤镜(NoIR)版本的传感器使用的自动白平衡(AWB)设置与标准版本不同。在 Raspberry Pi 5 或更高版本上,您可以使用以下命令为 IMX219 传感器指定 NoIR 调谐文件:
rpicam-hello --tuning-file /usr/share/libcamera/ipa/rpi/pisp/imx219_noir.json
Raspberry Pi 5 之前的 Raspberry Pi 型号使用不同的调谐文件。在这些设备上,请使用存储在 /usr/share/libcamera/ipa/rpi/vc4/ 中的文件。
libcamera 为许多摄像头(包括第三方型号)维护调谐文件。例如,您可以在 se327m12.json 中找到 Soho Enterprises SE327M12 的调谐文件。
使用多台摄像机
rpicam-apps 具有对多摄像头的基本支持。您可以通过以下方式将多个摄像头连接到 Raspberry Pi:
- 对于 Raspberry Pi 计算模块,您可以将两个摄像头直接连接到 Raspberry Pi 计算模块的 I/O 板上。有关详细信息,请参阅 计算模块文档。使用这种方法,您可以_同时使用两个摄像头_。
- 对于 Raspberry Pi 5,您可以使用双 MIPI 接口将两个摄像头直接连接到电路板上。
- 对于其他带有摄像头端口的 Raspberry Pi 设备,您可以使用视频多路复用器板(如 此第三方产品)连接两台或多台摄像头。由于两个摄像头都连接到一个 Unicam 端口,因此_每次只能使用一个摄像头_。
要列出平台上所有可用的摄像头,请使用 list-cameras 选项。要选择使用哪台摄像机,请向 camera 选项传递所请求摄像机的索引值。
libcamera 尚不支持立体摄像机。同时运行两台摄像机时,它们必须在不同的进程中运行,这意味着无法在它们之间同步 3A 操作。 作为一种变通方法,您可以通过 HQ (IMX477) 摄像机的外部同步信号来同步摄像机,或者使用下面介绍的软件摄像机同步支持,必要时将 3A 切换为手动模式。
软件摄像头同步
Raspberry Pi 的 libcamera 实现能够仅使用软件同步不同摄像头的帧。这将使一个摄像头调整其帧计时,以便尽可能与另一个摄像头的帧同步。无需焊接或硬件连接,它可以与 Raspberry Pi 的所有摄像头模块配合使用,甚至 可以与第三方模块配合使用,只要它们的驱动程序能正确实现帧时长控制。
工作原理
该方案的工作原理是指定一台摄像头作为_服务器。服务器将定时(如每秒一次)向网络广播定时信息。与此同时,其他被称为客户机的摄像头可以收听到这些信息,从而稍微延长或缩短帧时间,使其与服务器同步。这个过程是持续进行的,不过在第一次调整之后,后续的调整通常都很小。
客户端摄像头可以连接到与服务器相同的 Raspberry Pi 设备上,也可以连接到同一网络上的不同 Raspberry Pi 上。客户端的摄像头型号可能与服务器一致,也可能不同。
客户端和服务器需要以相同的标称帧率(如 30fps)运行。请注意,客户端与服务器之间没有后向通道。完全由客户端负责及时启动和运行,以与服务器保持一致,服务器完全不知道客户端是否已成功同步,或者是否存在任何客户端。
在正常运行情况下,在同一台 Raspberry Pi 上运行同一型号的摄像头,我们希望摄像头图像的帧开始时间能在 "几十微秒 "内匹配。当摄像机型号不同时,这个范围可能会大得多,因为摄像机的帧频可能无法完全匹配,因此会不断偏离(每一条定时信息都会使其重合)。
当摄像机安装在不同的设备上时,应使用 NTP(Raspberry Pi OS 默认情况下通常使用 NTP)来同步系统时钟,如果不够精确,也可以使用 PTP 等其他协议。系统时钟之间的任何差异都会直接导致帧开始时间的额外误差,尽管帧上的广告时间戳不会告诉你。
服务器
如前所述,服务器向网络广播定时信息,默认情况下每秒一次。服务器将运行固定帧数(默认为 100 帧),然后通知设备上的摄像机应用程序已达到 同步点。此时 ,应用程序将开始使用帧,因此在使用 rpicam-vid 的情况下,将开始对帧进行编码和记录。请注意,客户端的行为甚至存在与此无关。
如果需要,同一网络上可以有多个服务器,只要它们向不同的网络地址广播定时信息即可。当然,客户端必须配置为监听正确的地址。
客户端
客户端会侦听服务器的定时信息,收到信息后会按要求缩短或延长摄像机帧的持续时间,以便后续帧尽可能与服务器帧在同一时刻开始。
客户端从服务器的信息中了解到正确的 同步点,并像服务器一样,在同一时刻向摄像机应用程序发出信号,提示它开始使用帧。因此,在使用 rpicam-vid 的情况下,这也是开始记录帧的时刻。
通常情况下,先于服务器启动客户端是合理的,因为客户端只需等待(同步点尚未到达),直到看到服务器向网络广播。这显然可以避免服务器在所有客户端都启动之前就到达 同步点 的时间问题!
在 rpicam-vid 中的应用
我们可以使用软件摄像机同步与 rpicam-vid 来录制逐帧同步的视频。我们假设连接了两台摄像机,将摄像机 0 用作服务器,摄像机 1 用作客户端。rpicam-vid 默认为每秒 30 帧,可以按如下操作。
首先,我们应该启动客户端:
rpicam-vid -n -t 20s --camera 1 --codec libav -o client.mp4 --sync client
注意 -sync client 参数。在仅有一次触发同步点后,录制 20 秒。如有必要,它会无限期等待第一条服务器信息。
启动服务器:
rpicam-vid -n -t 20s --camera 0 --codec libav -o server.mp4 --sync server
这也将录制 20 秒,从到达同步点开始计时,然后开始录像。按照默认的同步设置(100 帧,30fps),这意味着客户端只需 3 秒钟多一点的时间就能完成同步。
服务器的广播地址和端口、定时信息的频率以及等待客户端同步的帧数都可以在摄像机调整文件中更改。客户端只需注意广播地址,该地址应与服务器地址一致;其他信息将被忽略。更多信息请参阅 Raspberry Pi 摄像机调谐指南。
在实际操作中,最后有几点需要注意:
- 固定帧频必须低于摄像机可运行的最大帧频(在使用的摄像机模式下)。这是因为同步算法可能需要缩短摄像机帧,以便客户端能赶上服务器,如果服务器已经以最快速度运行,同步算法就会失败。
- 虽然摄像机帧应正确同步,但在帧频较高或系统负载较大的情况下,客户端或服务器上的帧都有可能丢失。在这种情况下,帧时间戳会帮助应用程序找出发生了什么,不过通常更简单的方法是尽量避免丢帧--也许可以通过降低帧频、增加分配给摄像机队列的缓冲区数量(参见
--buffer-count选项)或减少系统负载来避免。
安装 libcamera 和 rpicam-apps
Raspberry Pi 提供两个 rpicam-apps 软件包:
rpicam-apps包含完整的应用程序,支持使用桌面环境进行预览。该软件包已预装在 Raspberry Pi 操作系统中。rpicam-apps-lite不支持桌面环境,只提供 DRM 预览。此软件包已预装在 Raspberry Pi OS Lite 中。
依赖关系
rpicam-apps 依赖于名为 library-name<n>的库包,其中 <n> 是 ABI 版本。软件包管理器会自动安装这些软件包。
开发包
您可以重建 rpicam-apps 而无需从头开始构建 libcamera 和 libepoxy。有关详细信息,请参阅 无需重建 libcamera 即可构建 rpicam-apps 。
使用 rpicam-apps 通过网络串流视频
本节介绍如何使用 rpicam-vid 通过网络传输视频流。虽然不使用 libav 也可以流式传输非常简单的格式,但对于大多数应用,我们建议使用 libav 后端。
UDP
要使用 Raspberry Pi 作为服务器通过 UDP 传输视频流,请使用以下命令,用客户端的 IP 地址或组播地址替换<ip-addr>占位符,用您希望用于流媒体传输的端口替换<port>占位符:
rpicam-vid -t 0 -n --inline -o udp://<ip-addr>:<port>
要使用 Raspberry Pi 作为客户端查看通过 UDP 传输的视频流,请使用以下命令,将<port>占位符替换为您希望从其传输流的端口:
ffplay udp://@:<port> -fflags nobuffer -flags low_delay -framedrop
如前所述,vlc 不再处理未封装的 H.264 流。
事实上,对未封装 H.264 的支持通常很差,因此最好还是发送 MPEG-2 传输流。通过使用 libav,可以做到这一点:
rpicam-vid -t 0 -n --codec libav --libav-format mpegts -o udp://<ip-addr>:<port>
在这种情况下,我们也可以使用 vlc 成功播放数据流:
vlc udp://@:<port>
TCP
您还可以通过 TCP 传输视频流。和以前一样,我们可以通过网络发送未封装的 H.264 视频流。将 Raspberry Pi 用作服务器:
rpicam-vid -t 0 -n --inline --listen -o tcp://0.0.0.0:<port>
要使用 Raspberry Pi 作为客户端查看通过 TCP 传输的视频流,假设服务器以每秒 30 帧的速度运行,请使用以下命令:
ffplay tcp://<ip-addr-of-server>:<port> -vf "setpts=N/30" -fflags nobuffer -flags low_delay -framedrop
但与 UDP 示例一样,通常最好发送 MPEG-2 传输流,因为 MPEG-2 传输流通常支持得更好。为此,请使用
rpicam-vid -t 0 -n --codec libav --libav-format mpegts -o tcp://0.0.0.0:<port>?listen=1
现在我们可以使用各种媒体播放器(包括vlc)回放这段视频:
vlc tcp://<ip-addr-of-server>:<port>
RTSP
我们可以将 VLC 用作 RTSP 服务器,但必须向其发送 MPEG-2 传输流,因为它不再能理解未封装的 H.264:
rpicam-vid -t 0 -n --codec libav --libav-format mpegts -o - | cvlc stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/stream1}'
要使用 Raspberry Pi 作为客户端查看通过 RTSP 传输的视频流,请使用以下命令:
ffplay rtsp://<ip-addr-of-server>:8554/stream1 -fflags nobuffer -flags low_delay -framedrop
或者,在客户端上使用以下命令使用 VLC 进行流式传输:
vlc rtsp://<ip-addr-of-server>:8554/stream1
如果想在服务器上看到预览窗口,只需去掉 -n 选项(请参阅 nopreview)。
libav 和 音频
我们已经使用 libav 作为网络流媒体的后端。只要我们使用的格式(如 MPEG-2 传输流)允许音频数据,libav 就允许我们添加音频流。
我们可以使用之前的命令,比如通过 TCP 传输 MPEG-2 传输流的命令,然后简单地添加 --libav-audio 选项:
rpicam-vid -t 0 --codec libav --libav-format mpegts --libav-audio -o "tcp://<ip-addr>:<port>?listen=1"
您也可以使用类似的命令通过 UDP 传输流媒体:
rpicam-vid -t 0 --codec libav --libav-format mpegts --libav-audio -o "udp://<ip-addr>:<port>"
GStreamer
GStreamer是一个用于读取、处理和播放多媒体文件的 Linux 框架。我们还可以将其与 rpicam-vid 结合使用,进行网络流媒体播放。
这个设置使用 rpicam-vid 将 H.264 比特流输出到 stdout,不过正如我们之前所做的那样,我们将把它封装到 MPEG-2 传输流中,以获得更好的下游兼容性。
然后,我们使用 GStreamer fdsrc 元素接收比特流,并使用额外的 GStreamer 元素通过网络发送比特流。在服务器上,运行以下命令启动流,将 <ip-addr> 占位符替换为客户端的 IP 地址或组播地址,并将 <port> 占位符替换为用于流媒体的端口:
rpicam-vid -t 0 -n --codec libav --libav-format mpegts -o - | gst-launch-1.0 fdsrc fd=0 ! udpsink host=<ip-addr> port=<port>
当然,我们可以使用任何东西(如 vlc)作为客户端,而播放效果最好的 GStreamer 客户端超出了本文档的范围。不过,我们注意到,以下流水线(有明显的替换)可以在 Pi 4 或更早的设备上运行:
gst-launch-1.0 udpsrc address=<ip-addr> port=<port> ! tsparse ! tsdemux ! h264parse ! queue ! v4l2h264dec ! autovideosink
对于 Pi 5,将 v4l2h264dec 替换为 avdec_h264。
要测试此配置,请使用 localhost 作为地址,在同一设备上的不同终端运行服务器和客户端命令。
libcamerasrc GStreamer 元素
libcamera 提供了一个 libcamerasrc 元素,可直接用于替代 rpicam-vid。要使用该元素,请在服务器上运行以下命令,用客户端的 IP 地址或组播地址替换 <ip-addr> 占位符,用希望用于流媒体的端口替换 <port> 占位符。在 Pi 4 或更早的设备上,请使用
gst-launch-1.0 libcamerasrc ! capsfilter caps=video/x-raw,width=640,height=360,format=NV12,interlace-mode=progressive ! v4l2h264enc extra-controls="controls,repeat_sequence_header=1" ! 'video/x-h264,level=(string)4' ! h264parse ! mpegtsmux ! udpsink host=<ip-addr> port=<port>
在 Pi 5 上,必须将 v4l2h264enc extra-controls="controls,repeat_sequence_header=1" 替换为 x264enc speed-preset=1 threads=1。
在客户端,我们可以使用与上文相同的播放管道,或其他流媒体播放器。
第三方流媒体服务器
有许多第三方流媒体服务器可用,虽然 Raspberry Pi 并不特别推荐任何一个,但我们提供了一些关于使用几个流行服务器的入门指南。
所有这些流媒体服务器都可以接收由 rpicam-vid 创建的 Raspberry Pi 摄像头流,并将它们重新流式传输到 RTSP 客户端,或使用 WebRTC 流式传输到网络浏览器,或使用许多其他格式。MediaMTX 通过 libcamera 支持将 Raspberry Pi 摄像头作为本地选项,绕过了对外部可执行文件(如 rpicam-vid)的需求。
上述列表并不详尽;但是,我们已经确认这些应用程序可以与 Raspberry Pi 摄像头系统正确配合工作。
使用 MediaMTX 流媒体
MediaMTX 接受来自 Raspberry Pi 摄像头系统的输入流(例如,由 rpicam-vid 创建),并将其重新流式传输到其他客户端。此外,它还支持将 Raspberry Pi 摄像头作为内置源。
安装和配置
要安装 MediaMTX:
-
从 releases 页面下载最新版本。
- 如果您使用的是 Raspberry Pi OS 64 位,请选择
linux_arm64压缩 tar 文件(以.tar.gz结尾)。 - 如果您使用的是 Raspberry Pi OS 32 位,请选择
armv7压缩 tar 文件。
- 如果您使用的是 Raspberry Pi OS 64 位,请选择
-
通过运行命令
tar -xvzf <filename.tar.gz>解压压缩的 tar 文件。该文件包含一个mediamtx可执行文件和一个名为mediamtx.yml的配置文件。 -
备份原始的
mediamtx.yml文件(推荐)。例如,您可以运行cp mediamtx.yml mediamtx.yml.original。我们建议这样做,因为原始文件记录了许多您可能想稍后探索的 Raspberry Pi 摄像头选项,因此保留一份副本可以作为参考。
添加摄像头流
要流式传输摄像头,请将 mediamtx.yml 的内容替换为以下内容:
paths:
cam:
source: rpiCamera
参数 source: rpiCamera 告诉 MediaMTX 自己启动和控制 Raspberry Pi 摄像头系统。
通过在命令提示符下输入可执行文件名称来启动 mediamtx 可执行文件,如有必要,请指定完整路径。
如果您希望 MediaMTX 仅在请求流时才获取摄像头,请在更新后的 mediamtx.yml 中添加以下一行:
sourceOnDemand: yes
请查阅原始的 mediamtx.yml 以 获取更多配置参数,这些参数可让您选择图像大小、摄像机模式、比特率等。通过在文件中搜索 rpi 来找到相关设置。
或者,您可以在 MediaMTX 外部运行 rpicam-vid,方法是按如下方式设置 mediamtx.yml:
paths:
cam:
source: udp://127.0.0.1:1234
您可以运行任何外部程序将 MPEG-TS 流输出到此地址。对于 rpicam-vid,它可能如下所示:
rpicam-vid -t 0 -n --codec libav --low-latency --libav-format mpegts -o udp://127.0.0.1:1234?pkt_size=1316
这提供了以某种方式更改图像的机会,也许使用 rpicam-apps 后处理功能,或 Picamera2 Python 模块。--low-latency 选项抑制 B 帧(在 Raspberry Pi 5 或更高版本上;早期的 Raspberry Pi 设备不生成任何 B 帧),这通常是明智的,因为客户端请求的某些流媒体格式不支持它们。
使用客户端查看
您可以在媒体播放器或网络浏览器中查看流。以下示例假设流名称为 'cam':
-
要使用 RTSP 协议的媒体播放器应用程序查看流,请使用地址
rtsp://<MediaMTX-服务器的IP地址>:8554/cam。 -
要在网络浏览器中查看流,请使用地址
http://<MediaMTX-服务器的IP地址>:8889/cam。
故障排除
视频流中偶尔出现的停顿可能是由于 Raspberry Pi 上的 UDP 接收缓冲区空间不足造成的。如果缓冲区太小,数据可能会被丢弃,从而导致可见的停顿。要永久增加这些缓冲区,请创建一个名为 /etc/sysctl.d/99-network-tuning.conf 的文件,其中包含以下行:
net.core.rmem_default=1000000
net.core.rmem_max=1000000
重新启动或运行 sudo sysctl -p /etc/sysctl.d/99-network-tuning.conf。
在 Raspberry Pi OS Bookworm 版本上,您必须改为将这些行添加到 /etc/sysctl.conf(然后重新启动或运行 sudo sysctl -p)。
有关 MediaMTX 及其功能的更多信息,请参阅 MediaMTX 文档。
使用 MistServer 流媒体
MistServer 是一款流行的免费媒体服务器,您可以将其与 Raspberry Pi 摄像头系统结合使用。与 MediaMTX 不同,它没有内置的摄像头支持;但是,您可以配置 MistServer 来接收来自 rpicam-vid 的流,并以各种格式将其提供给客户端。
安装和配置
您可以按照 MistServer 文档中的说明在 Raspberry Pi 上安装 MistServer:
- 对于 64 位操作系统,请按照 Armv8 64 位 Linux 中的说明操作。
- 对于 32 位操作系统,请按照 Armv7 Linux 中的说明操作。
确保以 root 身份运行命令。此过程设置了一个自动运行的系统 MistServer 服务。
要配置 MistServer,请在 Raspberry Pi 上访问管理界面(MI)网页 http://localhost:4242/;如果您替换 Raspberry Pi 的 IP 地址,也可以从另一台计算机访问该页面。第一次使用管理界面时,它会要求您创建一个管理员账户。在接下来的步骤中,您可以接受默认值。
您也可以在与摄像头不同的计算机上运行 MistServer。
添加摄像头流
要添加摄像头流,请转到管理界面网页并完成以下步骤:
- 在左侧窗格中,选择 Streams。
- 在右侧窗格中,选择 Create Stream。
- 填写 所需信息:
- 流名称,例如 'cam'。这是客户端识别此流的方式。
- 源。要配置 MistServer 自动启动
rpicam-vid,请输入以下命令:此命令中的参数配置了以下内容:ts-exec: rpicam-vid -n -t 0 --width 1920 --height 1080 --codec libav --libav-format mpegts -o -ts-exec配置命令将 MPEG-TS 流输出到stdout。此前缀要求 MistServer 在带有摄像头的 Raspberry Pi 上运行。rpicam-vid是视频命令。-n配置无预览。-t配置命令无限 期运行。--width和--height指定您选择的尺寸。
或者,如果您在外部运行 rpicam-vid,输出到 UDP 套接字,请使用 tsudp 代替 ts-exec,并在其后跟上传入流的 IP 地址。
使用客户端查看
您可以在媒体播放器或网络浏览器中查看流。以下示例假设流名称为 'cam':
-
要使用 RTSP 协议的媒体播放器应用程序查看流,请使用地址:
rtsp://<MistServer-服务器的IP地址>:8554/cam。 -
要在网页中查看流,请使用 MistServer 的内置媒体播放器页面。在您的网络浏览器中,输入:
http://<MistServer-服务器的IP地址>:8080/cam.html。
有关 MistServer 用例和选项的更多信息,请参阅 MistServer 文档。
使用 go2rtc 流媒体
go2rtc 是一个媒体服务器平台,虽然不像 MediaMTX 那样提供直接集成,但允许以与 MistServer 相同的方式进行互操作。
安装和配置
要安装 go2rtc:
- 从 releases 页面下载二进制文件:
- 如果您运行的是 64 位操作系统,请选择
go2rtc_linux_arm64二进制文件。 - 如果您运行的是 32 位操作系统,请选择
go2rtc_linux_arm二进制文件。 - 如果您的设备是 Raspberry Pi 1 或 Zero,请选择
go2rtc_linux_armv6二进制文件。
- 如果您运行的是 64 位操作系统,请选择
- 更改文件权限以使下载的二进制文件可执行。
- 运行二进制文件。
您可以使用默认配置运行此应用程序。当 go2rtc 运行时,管理页面位于 http://localhost:1984/。
与 MediaMTX 一样,您可以在与带有摄像头的 Raspberry Pi 不同的系统上运行 go2rtc。
添加摄像头流
您可以通过在运行可执行文件的同一文件夹中创建文件 go2rtc.yaml 来添加摄像头流。当 go2rtc 启动时,它会向控制台输出一条消息,指示它期望在哪里找到其配置文件。
将以下文本添加到文件中,替换您所需的宽度和高度:
streams:
cam:
- exec:rpicam-vid -n -t 0 --width 1280 --height 720 --codec libav --libav-format mpegts --low-latency -o -
此配置在任何客户端请求 'cam' 流时启动 rpicam-vid。参数 --low-latency 在 Raspberry Pi 5 或更高版本上抑制 B 帧。在这种情况下,go2rtc 必须在带有摄像头的 Raspberry Pi 上运行。
或者,您可以在外部运行 rpicam-vid 并让它将 MPEG-TS 流输出到地址,例如 udp://127.0.0.1:1234。要进行配置,请确保 go2rtc.yaml 文件包含以下文本:
cam:
- ffmpeg:udp://127.0.0.1:1234
如果 go2rtc 在与摄像头不同的计算机上运行,请调整 IP 地址。
使用客户端查看
要使用 RTSP 协议的媒体播放器应用程序查看流,假设流名称为 'cam',请使用地址:rtsp://<go2rtc-服务器的IP地址>:8554/cam。
要在网页中查看流,请使用 go2rtc 的内置页面。输入 http://<go2rtc-服务器的IP地址>:1984/stream.html?src=cam。
有关 go2rtc 用例和选项的更多信息,请参阅 go2rtc README 文档。
rpicam-apps 选项参考
常用选项
除非另有说明,下列选项适用于所有具有相似或相同语义的 rpicam-apps。
要将下列选项之一传递给应用程序,请在选项名称前加上 --。如果选项需要一个值,则将该值紧跟在选项名称之后,用一个空格分隔。如果值中包含空格,则用引号将值包围起来。
有些选项有速记别名,例如用 -h 代替 --help。使用这些速记别名代替完整的选项名称,可以节省空间和时间,但会影响可读性。
help
别名: -h
打印全套选项,以及每个选项的简要说明。不接受值。
version
打印 libcamera 和 rpicam-apps 的版本字符串。不接受数值。
输出示例:
rpicam-apps build: ca559f46a97a 27-09-2021 (14:10:24)
libcamera build: v0.0.0+3058-c29143f7
list-cameras
列出连接到 Raspberry Pi 的检测到的摄像头及其可用的传感器模式 。不接受值。
传感器模式标识符的形式如下:S<Bayer order><Bit-depth>_<Optional packing> : <Resolution list>
裁切以原始传感器像素(即使在像素分档模式下)指定为 (<x>,<y>)/<Width>×<Height>。(x, y) 指定传感器阵列中大小为 weidth × height 的裁剪窗口的位置。
例如,以下输出显示索引 0 处的 IMX219 传感器和索引 1 处的 IMX477 传感器的信息:
Available cameras
-----------------
0 : imx219 [3280x2464] (/base/soc/i2c0mux/i2c@1/imx219@10)
Modes: 'SRGGB10_CSI2P' : 640x480 [206.65 fps - (1000, 752)/1280x960 crop]
1640x1232 [41.85 fps - (0, 0)/3280x2464 crop]
1920x1080 [47.57 fps - (680, 692)/1920x1080 crop]
3280x2464 [21.19 fps - (0, 0)/3280x2464 crop]
'SRGGB8' : 640x480 [206.65 fps - (1000, 752)/1280x960 crop]
1640x1232 [41.85 fps - (0, 0)/3280x2464 crop]
1920x1080 [47.57 fps - (680, 692)/1920x1080 crop]
3280x2464 [21.19 fps - (0, 0)/3280x2464 crop]
1 : imx477 [4056x3040] (/base/soc/i2c0mux/i2c@1/imx477@1a)
Modes: 'SRGGB10_CSI2P' : 1332x990 [120.05 fps - (696, 528)/2664x1980 crop]
'SRGGB12_CSI2P' : 2028x1080 [50.03 fps - (0, 440)/4056x2160 crop]
2028x1520 [40.01 fps - (0, 0)/4056x3040 crop]
4056x3040 [10.00 fps - (0, 0)/4056x3040 crop]
对于上述示例中的 IMX219 传感器:
- 所有模式都有
RGGB拜尔排序 - 所有模式均可在所列分辨率下提供 8 位或 10 位 CSI2 封装读数
camera
选择要使用的摄像机。从 可用摄像机列表中指定一个索引。
config
别名: -c
指定包含 CLI 选项和值的文件。考虑一个名为 example_configuration.txt 的文件,其中包含以下文本,以键值对的形式指定选项和值,每行一个选项,只有长(非别名)选项名:
timeout=99000
verbose=
省略通常在命令行中传递的前导 --。对于缺少值的标志,例如上例中的 verbose,必须包含尾部的 =。
然后,你可以运行以下命令来指定超时 99000 毫秒和verbose 输出:
rpicam-hello --config example_configuration.txt
timeout
别名: -t
默认值:5000 毫秒(5 秒)
指定应用程序关闭前的运行时间。除非使用可选后缀更改单位,否则该值将被解释为毫秒数。后缀可以是
min- 分钟s或sec- 秒ms- 毫秒(未使用后缀时为默认值)us- 微秒ns- 纳秒。
该时间适用于视频录制和预览窗口。捕捉静态图像时,应用程序会在捕捉输出图像前显示预览窗口,时间长度由 timeout 参数指定。
要无限期运行应用程序,请指定0值。也允许使用浮点数值。
例如:rpicam-hello -t 0.5min 将运行 30 秒。
preview
别名:`-p
设置桌面或 DRM 预览窗口的位置(x、y 坐标)和大小(w、h 尺寸)。不会影响从摄像机请求的图像的分辨率或宽高比。缩放图像大小并调整图像宽高比,使其适合预览窗口。
以下 列逗号分隔的形式传递预览窗口尺寸: x,y,w,h。
例如:rpicam-hello --preview 100,100,500,500
fullscreen
别名: -f
强制预览窗口使用整个屏幕,无边框或标题栏。缩放图像大小和柱形图或字母框图像宽高比,以适应整个屏幕。不接受数值。
qt-preview
使用 Qt 预览窗口,它比其他方法消耗更多资源,但支持 X 窗口转发。与 fullscreen 标志不兼容。不接受值。
nopreview.
别名: n
使应用程序根本不显示预览窗口。不接受值。
info-text
默认值:"#%frame (%fps fps) exp %exp ag %ag dg %dg"
在桌面环境中运行时,将提供的字符串设置为预览窗口的标题。支持以下图像元数据替换:
| 指令 | 替换 |
|---|---|
%frame | 帧的序列号 |
%fps | 瞬时帧频 |
%exp | 拍摄图像 时使用的快门速度(微秒) |
%ag | 应用于传感器图像的模拟增益 |
%dg | ISP 应用于图像的数字增益 |
%rg | 应用于每个像素红色分量的增益 |
%bg | 应用于每个像素蓝色分量的增益 |
%focus | 图像的焦点度量,数值越大意味着图像越清晰 |
%lp | 当前镜头的位置,单位为度数(1/距离,单位为米) |
%afstate | 自动对焦算法状态(idle(空闲)、scanning(扫描)、focused(对焦)或failed(失败) |
width 和 height
接受以像素为单位定义捕获图像尺寸的数字。
对于 rpicam-still、rpicam-jpeg 和 rpicam-vid,指定输出分辨率。
对于 rpicam-raw,指定原始帧的分辨率。对于采用 2×2 分档读出模式的摄像机,指定等于或小于分档模式的分辨率可捕获 2×2 分档的原始图像。
对于 rpicam-hello 没有影响。
示例
-
rpicam-vid -o test.h264 --width 1920 --height 1080捕捉 1080p 视频。 -
rpicam-still -r -o test.jpg --width 2028 --height 1520捕捉分辨率为 2028×1520 的 JPEG 文件。如果与 HQ 摄像机一起使用,则使用 2×2 分档模式,因此原始文件 (test.dng)包含 2028×1520 的原始拜尔图像。
viewfinder-width 和 viewfinder-height
每个选项都接受一个数字,定义预览窗口中显示图像的尺寸(以像素为单位)。不会影响预览窗口的尺寸,因为图像会调整大小以适应。不影响捕获的静态图像或视频。
mode
允许以下列以冒号分隔的格式指定摄像机模式: <宽度>:<高度>:<位深>:<包装>。如果所提供的值不完全匹配,系统会为传感器选择最接近的可用选项。您可以使用打包 (P) 或未打包 (U) 的打包格式。影响存储视频和照片的格式,但不影响传递到预览窗口的帧格式。
比特深度和打包是可选的。 比特深度默认为 12。 打包默认为 "P"(打包)。
有关传感器可用的比特深度、分辨率和打包选项的信息,请参阅 list-cameras。
举例说明:
4056:3040:12:P- 4056×3040 分辨率,每像素 12 位,打包。1632:1224:10- 1632×1224 分辨率,每个像素 10 位。2592:1944:10:U- 2592×1944 分辨率,每像素 10 位,未打包。3264:2448- 3264×2448 分辨率。