使用rpicam-app通过网络流式传输视频
文章来源: http://raspberry.dns8844.cn/documentation
使用 rpicam-app
通过网络流式传输视频
本节介绍来自 rpicam-vid
的本机流。您还可以使用 libav
后端进行网络流。
UDP
要使用Raspberry Pi作为服务器通过UDP流式传输视频,请使用以下命令,将 <ip-addr>
占位符替换为客户端或多播地址的IP地址,并将 <port>
占位符替换为您要用于流式传输的端口:
$ rpicam-vid -t 0 --inline -o udp://<ip-addr>:<port>
要使用Raspberry Pi作为客户端查看通过UDP流式传输的视频,请使用以下命令,将 <port>
占位符替换为您要从中流式传输的端口:
$ vlc udp://@:<port> :demux=h264
或者,在客户端上使用以下命令使用 ffplay
进行流式传输:
$ ffplay udp://<ip-addr-of-server>:<port> -fflags nobuffer -flags low_delay -framedrop
TCP
您还可以通过TCP流式传输视频。要将Raspberry Pi用作服务器:
$ rpicam-vid -t 0 --inline --listen -o tcp://0.0.0.0:<port>
要使用Raspberry Pi作为客户端查看通过TCP流式传输的视频,请使用以下命令:
$ vlc tcp/h264://<ip-addr-of-server>:<port>
或者,在客户端上使用以下命令以每秒30帧的速度使用 ffplay
进行流式传输:
$ ffplay tcp://<ip-addr-of-server>:<port> -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 5 上获得最佳性能,请使用以下命令,该命令添加了 libav 以强制使用 H264 格式:
$ rpicam-vid -t 0 --inline --libav-format h264 -o - | cvlc stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/stream1}' :demux=h264
要使用Raspberry Pi作为客户端查看通过RTSP流式传输的视频,请使用以下命令:
$ ffplay rtsp://<ip-addr-of-server>:8554/stream1 -vf "setpts=N/30" -fflags nobuffer -flags low_delay -framedrop
或者,在客户端上使用以下命令使用VLC进行流式传输:
$ vlc rtsp://<ip-addr-of-server>:8554/stream1
要取消服务器上的预览窗口,请使用 nopreview
。
使用 inline
标志强制流头信息进入每个帧内,这有助于客户端在错过开头时理解流。
libav
您可以将 libav
后端用作音频/视频的网络流源。
要使用Raspberry Pi作为服务器通过TCP流式传输视频,请使用以下命令,将 <ip-addr>
占位符替换为客户端或多播地址的IP地址,并将 <port>
占位符替换为您要用于流式传输的端口:
$ 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
https://gstreamer.freedesktop.org/\[GStreamer\] 是一个用于读取、处理和播放多媒体文件的Linux框架。本节展示如何使用 rpicam-vid
通过网络流式传输视频。
此设置使用 rpicam-vid
将编码的h.264比特流输出到标准输出。然后,我们使用GStreamer fdsrc
元素接收比特流,并使用额外的GStreamer元素通过网络发送它。在服务器上,运行以下命令来启动流,将 <ip-addr>
占位符替换为客户端的IP地址或多播地址,并将 <port>
占位符替换为您要用于流式传输的端口:
$ rpicam-vid -t 0 -n --inline -o - | gst-launch-1.0 fdsrc fd=0 ! udpsink host=<ip-addr> port=<port>
在客户端上,运行以下命令来接收流,将 <ip-addr>
占位符替换为客户端的IP地址或多播地址,并将 <port>
占位符替换为您要用于流的端口:
$ gst-launch-1.0 udpsrc address=<ip-addr> port=<port> ! h264parse ! v4l2h264dec ! autovideosink
TIP: 要测试此配置,请在同一设备上的不同终端中运行服务器和客户端命令,使用 localhost
作为地址。
RTP
$ rpicam-vid -t 0 -n --inline -o - | gst-launch-1.0 fdsrc fd=0 ! h264parse ! rtph264pay ! udpsink host=<ip-addr> port=<port>
要通过RTP接收,请在客户端上运行以下命令,将 <ip-addr>
占位符替换为客户端的IP地址或多播地址,并将 <port>
占位符替换为您要用于流式传输的端口:
$ gst-launch-1.0 udpsrc address=<ip-addr> port=<port> caps=application/x-rtp ! rtph264depay ! h264parse ! v4l2h264dec ! autovideosink
如果客户端不是Raspberry Pi,它可能有不同的GStreamer元素可用。在运行Linux的x86设备上,您可以改为运行以下命令:
$ gst-launch-1.0 udpsrc address=<ip-addr> port=<port> caps=application/x-rtp ! rtph264depay ! h264parse ! avdec_h264 ! autovideosink
libcamerasrc
GStreamer 元素
libcam
提供了一个 libcamasrc
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=<ip-addr> port=<port>
在客户端上,我们使用与以前相同的播放管道。
上一篇 -- 树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
下一篇 -- <>