概述

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
# 启动 RTSP 服务器,接收 wfb_rx 输出的 H.264 RTP 流
wfb_rtsp -P 5600 h264

# 在另一台机器上用 VLC 打开:
# rtsp://<地面站IP>:8554/wfb

2. H.265/HEVC 视频播放

1
2
# 使用 H.265 编码(需要发送端也配置为 H.265)
wfb_rtsp -P 5600 h265

3. 自定义端口和路径

1
2
3
4
# RTSP 监听 8000 端口,RTP 数据从 5700 接收,挂载路径 /video
wfb_rtsp -p 8000 -P 5700 -u /video h264

# 客户端访问:rtsp://<IP>:8000/video

4. 低延迟模式(竞技 FPV)

1
2
# MTU 1200 减少分片,抖动缓冲 0ms 最小延迟
wfb_rtsp -m 1200 -l 0 h264

5. 稳定模式(远距离/弱信号)

1
2
# 增大抖动缓冲到 200ms 吸收网络波动
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
# H.264
gst-launch-1.0 playbin uri=rtsp://127.0.0.1:8554/wfb

# 或使用 rtspsrc(更精细的控制)
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
# 摄像头 -> H.264 编码 -> RTP/UDP -> wfb_tx -> 无线
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 -> RTP/UDP -> wfb_rtsp -> RTSP 客户端
wfb_rx -K /etc/gs.key -c 127.0.0.1 -u 5600 wlan0

wfb_rtsp -P 5600 h264

# VLC 播放:rtsp://127.0.0.1:8554/wfb

注意事项

  1. 端口冲突:确保 -p(RTSP)和 -P(RTP)端口未被其他程序占用
  2. 防火墙:需要在防火墙上开放 RTSP 端口(默认 8554)和 RTP 数据端口范围
  3. 编码匹配wfb_rtsp 指定的编码格式必须与发送端编码器输出的格式一致
  4. GStreamer 版本:需要 GStreamer >= 1.0 及 gst-rtsp-server 开发库

依赖库

  • GStreamer Core(>= 1.0)
  • GStreamer RTSP Server(libgstrtspserver-1.0)
  • GLib/GIO(GMainLoop 事件循环)