捕获高帧率视频要最大程度地减少高帧率 (> 60fps) 视频的丢帧,请尝试以下配置调整: 使用 --level 4.2将 H.264 目标级别设置为 4.2 。 通过将降噪选项设置为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-vidRPiCam-VID 可以使用 ffmpeg/libav 编解码器后端对音频和视频流进行编码。您可以将这些流保存到文件中,也可以通过网络流式传输它们。libav 使用硬件 H.264 视频编码(如果存在)。 要启用 libav 后端,请将 libav 传递给编解码器选项: rpicam-vid --codec libav --libav-format avi --libav-audio --output example.avi
rpicam-rawrpicam-raw 直接从传感器将视频录制为原始拜耳帧。它不显示预览窗口。若要将两秒的原始剪辑录制到名为 test.raw 的文件,请运行以下命令: rpicam-raw -t 2000 -o test.raw
rpicam-raw 直接一个接一个地输出完全没有格式信息的原始帧。应用程序将像素格式和图像尺寸打印到终端窗口,以帮助用户解释像素数据。 默认情况下,rpicam-raw 在单个可能非常大的文件中输出原始帧。使用 segment 选项将每个原始帧定向到单独的文件,并使用 %05d 指令使每个帧文件名唯一: rpicam-raw -t 2000 --segment 1 -o test%05d.raw
借助快速存储设备,rpicam-raw 可以以 10fps 的速度将 18MB 1200 万像素的 HQ 相机帧写入磁盘。rpicam-raw 无法将输出帧格式化为 DNG 文件;对于该功能,请使用 RPiCam-Still。在低于 10 的级别使用帧速率选项以避免丢帧: 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 构建说明。不要忘记在运行 cmake 时传递 -DENABLE_TFLITE=1。 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 OS 可识别 /boot/firmware/config.txt 中的以下覆盖层。 Camera Module | In/boot/firmware/config.txt |
---|
V1 camera (OV5647) | dtoverlay=ov5647 | V2 camera (IMX219) | dtoverlay=imx219 | HQ camera (IMX477) | dtoverlay=imx477 | GS camera (IMX296) | dtoverlay=imx296 | Camera Module 3 (IMX708) | dtoverlay=imx708 | IMX290 and 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 的 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 选项。若要选择要使用的相机,请将相机索引传递给相机选项。 注意:libcamera 尚不提供立体相机支持。同时运行两台摄像机时,它们必须在不同的进程中运行。这意味着它们之间无法同步传感器成帧或 3A 操作。作为解决方法,您可以通过 HQ (IMX477) 相机的外部同步信号同步相机,并在必要时将 3A 切换到手动模式。 安装 libcamera 和 rpicam-appsRaspberry Pi 提供了两个 rpicam-apps 包: 依赖rpicam-apps 依赖于名为 library-name 的库包<n>,其中 <n> ABI 版本。包管理器应自动安装这些软件包。 开发包您可以重建 rpicam-apps,而无需从头开始构建 libcamera 和 libepoxy。有关更多信息,请参阅在不重建 libcamera 的情况下构建 rpicam-apps。 使用 rpicam-apps 通过网络流式传输视频本节介绍来自 rpicam-vid 的原生流式处理。您还可以使用 libav 后端进行网络流式处理。 UDP要使用 Raspberry Pi 作为服务器通过 UDP 流式传输视频,请使用以下命令,<ip-addr>将占位符替换为客户端或组播地址的 IP 地址,并将<port>占位符替换为要用于流式传输的端口: rpicam-vid -t 0 --inline -o udp://:
要使用 Raspberry Pi 作为客户端查看通过 UDP 流式传输的视频,请使用以下命令,并将<port>占位符替换为要从中流式传输的端口: vlc udp://@: :demux=h264
或或者,在客户端上使用以下命令通过 ffplay 进行流式传输: ffplay udp://: -fflags nobuffer -flags low_delay -framedrop
技术合作计划(TCP)您还可以通过 TCP 流式传输视频。要使用 Raspberry Pi 作为服务器: rpicam-vid -t 0 --inline --listen -o tcp://0.0.0.0:
要使用 Raspberry Pi 作为客户端查看通过 TCP 流式传输的视频,请使用以下命令: vlc tcp/h264://:
或者,在客户端上使用以下命令,以 30 帧/秒的速度使用 ffplay 进行流式传输: ffplay tcp://: -vf "setpts=N/30" -fflags nobuffer -flags low_delay -framedrop
RTSP的要使用 VLC 通过 Raspberry Pi 作为服务器的 RTSP 流式传输视频,请使用以下命令: rpicam-vid -t 0 --inline -o - | cvlc stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/stream1}' :demux=h264
要使用 Raspberry Pi 作为客户端查看通过 RTSP 流式传输的视频,请使用以下命令: ffplay rtsp://:8554/stream1 -vf "setpts=N/30" -fflags nobuffer -flags low_delay -framedrop
或者,在客户端上使用以下命令通过 VLC 进行流式传输: vlc rtsp://:8554/stream1
若要禁止显示服务器上的预览窗口,请使用 nopreview。 使用内联标志将流标头信息强制到每个帧内,这有助于客户端在错过开头时理解流。 libav您可以将 libav 后端用作音频/视频的网络流源。要使用 Raspberry Pi 作为服务器通过 TCP 流式传输视频,请使用以下命令,<ip-addr>将占位符替换为客户端或组播地址的 IP 地址,并将<port>占位符替换为要用于流式传输的端口: rpicam-vid -t 0 --codec libav --libav-format mpegts --libav-audio -o "tcp://:?listen=1"
您可以使用类似的命令通过 UDP 进行流式传输: rpicam-vid -t 0 --codec libav --libav-format mpegts --libav-audio -o "udp://:"
GStreamerGStreamer 是一个用于读取、处理和播放多媒体文件的 Linux 框架。本节介绍如何使用 rpicam-vid 通过网络流式传输视频。 此此设置使用 rpicam-vid 将编码的 h.264 比特流输出到 stdout。然后,我们使用 GStreamer fdsrc 元素接收比特流,并使用额外的 GStreamer 元素通过网络发送比特流。在服务器上,运行以下命令启动流,将<ip-addr>占位符替换为客户端或组播地址的 IP 地址,并将<port>占位符替换为要用于流式传输的端口: rpicam-vid -t 0 -n --inline -o - | gst-launch-1.0 fdsrc fd=0 ! udpsink host= port=
在客户端上,运行以下命令以接收流,<ip-addr>将占位符替换为客户端的 IP 地址或组播地址,并将<port>占位符替换为要用于流的端口: gst-launch-1.0 udpsrc address= port= ! h264parse ! v4l2h264dec ! autovideosink
提示:要测试此配置,请在同一设备上的不同终端中运行服务器和客户端命令,并使用 localhost 作为地址。 RTP要使用 RTP 进行流式传输,请在服务器上运行以下命令,将<ip-addr>占位符替换为客户端或组播地址的 IP 地址,并将<port>占位符替换为要用于流式传输的端口: rpicam-vid -t 0 -n --inline -o - | gst-launch-1.0 fdsrc fd=0 ! h264parse ! rtph264pay ! udpsink host= port=
要通过 RTP 接收,请在客户端上运行以下命令,<ip-addr>将占位符替换为客户端或组播地址的 IP 地址,并将<port>占位符替换为要用于流式传输的端口: gst-launch-1.0 udpsrc address= port= caps=application/x-rtp ! rtph264depay ! h264parse ! v4l2h264dec ! autovideosink
如果客户端不是 Raspberry Pi,它可能有不同的 GStreamer 元素可用。在运行 Linux 的 x86 设备上,可以改为运行以下命令: gst-launch-1.0 udpsrc address= port= caps=application/x-rtp ! rtph264depay ! h264parse ! avdec_h264 ! autovideosink
libcamerasrc GStreamer 元素libcamera 提供了一个 libcamerasrc GStreamer 元素,可以直接使用它来代替 rpicam-vid。若要使用此元素,请在服务器上运行以下命令,<ip-addr>将占位符替换为客户端或多播地址的 IP 地址,并将<port>占位符替换为要用于流式处理的端口: gst-launch-1.0 libcamerasrc ! capsfilter caps=video/x-raw,width=1280,height=720,format=NV12 ! v4l2convert ! v4l2h264enc extra-controls="controls,repeat_sequence_header=1" ! 'video/x-h264,level=(string)4.1' ! h264parse ! rtph264pay ! udpsink host= port=
在客户端上,我们使用与以前相同的播放管道。 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
|