概述
wfb_rtsp 是 WFB-ng 的 RTSP(Real Time Streaming Protocol)服务器程序,基于 GStreamer RTSP Server 库实现。它将来自 wfb_rx 的 UDP RTP 视频流封装为标准的 RTSP/RTP 服务,供 VLC、GStreamer、FFmpeg 等标准媒体播放器消费。
该程序主要用于地面站端,将无线链路接收到的 H.264/H.265 视频流转换为可通过局域网或网络访问的标准 RTSP 流。
使用方式
1
| wfb_rtsp [-m mtu] [-u uri] [-p rtsp_port] [-P rtp_port] [-l latency] { h264 | h265 }
|
参数详解
| 参数 |
说明 |
默认值 |
-m mtu |
RTP 分组的 MTU 大小(字节)。控制 rtph264pay/rtph265pay 插件的最大分组大小。较小的值适合不稳定的网络,较大的值减少头部开销提高带宽利用率。 |
1400 |
-u uri |
RTSP 挂载路径(URI)。必须以 / 开头。客户端通过 rtsp://host:port/path 访问流。 |
/wfb |
-p rtsp_port |
RTSP 服务器监听端口号。RTSP 控制协议在此端口接受客户端连接。 |
8554 |
-P rtp_port |
RTP 数据源 UDP 端口号。程序从此端口接收来自 wfb_rx 的 RTP 视频数据包。必须与 wfb_rx 的输出端口一致。 |
5600 |
-l latency |
RTP 抖动缓冲区延迟(毫秒)。设置在 rtpjitterbuffer 元素中的延迟值。增大可减少因网络抖动导致的画面卡顿,但会增加端到端延迟。设为 0 表示使用插件默认值。 |
0 |
{ h264 | h265 } |
视频编码格式(必需参数)。h264 表示 H.264/AVC 编码,h265 表示 H.265/HEVC 编码。决定使用哪个 GStreamer depay/pay 插件。 |
- |
内部 GStreamer Pipeline
程序根据参数自动生成以下 GStreamer pipeline:
H.264 模式
1 2 3 4 5
| udpsrc port=<rtp_port> ! \ application/x-rtp,media=video,clock-rate=90000,encoding-name=H264 ! \ rtpjitterbuffer latency=<latency> ! \ rtph264depay ! \ rtph264pay name=pay0 pt=96 config-interval=1 aggregate-mode=zero-latency mtu=<mtu>
|
H.265 模式
1 2 3 4 5
| udpsrc port=<rtp_port> ! \ application/x-rtp,media=video,clock-rate=90000,encoding-name=H265 ! \ rtpjitterbuffer latency=<latency> ! \ rtph265depay ! \ rtph265pay name=pay0 pt=96 config-interval=1 aggregate-mode=zero-latency mtu=<mtu>
|
Pipeline 元素说明
| 元素 |
作用 |
udpsrc |
从指定 UDP 端口接收 RTP 数据包(来自 wfb_rx) |
application/x-rtp,... |
Caps 过滤器,定义媒体类型、时钟速率和编码名称 |
rtpjitterbuffer |
抖动缓冲器,吸收网络延迟波动,减少画面卡顿 |
rtph264depay/rtph265depay |
RTP 解封装器,提取原始 H.264/H.265 比特流 |
rtph264pay/rtph265pay |
RTP 重新封装器,将裸流重新打包为 RTP。设置 aggregate-mode=zero-latency 实现最低延迟 |
启动后的访问地址
程序启动后输出 RTSP URL:
1 2 3
| $ wfb_rtsp -P 5600 h264 Pipeline: ( udpsrc port=5600 ! application/x-rtp,media=video,clock-rate=90000,encoding-name=H264 ! rtpjitterbuffer latency=0 ! rtph264depay ! rtph264pay name=pay0 pt=96 config-interval=1 aggregate-mode=zero-latency mtu=1400 ) H264 stream with mtu 1400 ready at rtsp://127.0.0.1:8554/wfb
|
客户端使用此 URL 连接:rtsp://<服务器IP>:8554/wfb
Session 管理
- 自动清理:每 2 秒自动清理过期的 RTSP session
- 共享模式:media factory 设置为
shared = TRUE,多个客户端可以连接到同一个流(单播/组播由 GStreamer 自动决定)
典型使用场景
1. 地面站 H.264 视频播放
1 2 3 4 5
| wfb_rtsp -P 5600 h264
|
2. H.265/HEVC 视频播放
3. 自定义端口和路径
1 2 3 4
| wfb_rtsp -p 8000 -P 5700 -u /video h264
|
4. 低延迟模式(竞技 FPV)
1 2
| wfb_rtsp -m 1200 -l 0 h264
|
5. 稳定模式(远距离/弱信号)
1 2
| wfb_rtsp -m 1400 -l 200 h264
|
客户端播放方式
VLC
1
| vlc rtsp://127.0.0.1:8554/wfb
|
或在 VLC GUI 中:媒体 -> 打开网络串流 -> 输入 RTSP URL
GStreamer
1 2 3 4 5 6
| gst-launch-1.0 playbin uri=rtsp://127.0.0.1:8554/wfb
gst-launch-1.0 rtspsrc location=rtsp://127.0.0.1:8554/wfb ! \ decodebin ! autovideosink sync=false
|
FFmpeg
1
| ffmpeg -i rtsp://127.0.0.1:8554/wfb -pix_fmt yuv420p output.mp4
|
Python (OpenCV)
1 2 3 4 5 6 7 8 9 10
| import cv2 cap = cv2.VideoCapture('rtsp://127.0.0.1:8554/wfb') while True: ret, frame = cap.read() if ret: cv2.imshow('WFB-ng Video', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
|
完整链路示例
无人机端(发送)
1 2 3 4 5 6
| raspivid -n -ex fixedfps -w 960 -h 540 -b 4000000 -fps 30 -t 0 -o - | \ gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=35 ! \ udpsink sync=false host=127.0.0.1 port=5602
wfb_tx -K /etc/drone.key -u 5602 wlan0
|
地面站端(接收)
1 2 3 4 5 6
| wfb_rx -K /etc/gs.key -c 127.0.0.1 -u 5600 wlan0
wfb_rtsp -P 5600 h264
|
注意事项
- 端口冲突:确保
-p(RTSP)和 -P(RTP)端口未被其他程序占用
- 防火墙:需要在防火墙上开放 RTSP 端口(默认 8554)和 RTP 数据端口范围
- 编码匹配:
wfb_rtsp 指定的编码格式必须与发送端编码器输出的格式一致
- GStreamer 版本:需要 GStreamer >= 1.0 及
gst-rtsp-server 开发库
依赖库
- GStreamer Core(>= 1.0)
- GStreamer RTSP Server(libgstrtspserver-1.0)
- GLib/GIO(GMainLoop 事件循环)