如何制作Gstreamer RTSP -> UDP -> RTSP低延迟管道?

问题描述 投票:0回答:1

我需要通过 udp 端口从 axis 相机转发 rtsp 流。 我在发送端有这个管道:

gst-launch-1.0 rtspsrc location='rtsp://XXXX:[email protected]/axis-media/media.amp'  latency=0 ! \
rtph264depay ! \
h264parse ! \
rtph264pay config-interval=1 ! \
udpsink host=127.0.0.1 port=5005 sync=false

然后在接收端,如果我运行这个管道:

gst-launch-1.0 udpsrc port=5005 buffer-size=200000 caps="application/x-rtp, media=(string)video, encoding-name=(string)H264, payload=(int)96" ! \
rtpjitterbuffer do-lost=true latency=450 ! \
rtph264depay ! \
h264parse ! queue2 use-buffering=true max-size-buffers=1000 max-size-bytes=0 max-size-time=0 ! \
avdec_h264 max-threads=8 ! \
videoconvert ! \
autovideosink sync=false

我可以完美地看到流,并且它基本上增加了 0 延迟。太棒了。

然后我使用此管道将其转发到我的 mediamtx rtsp 服务器(基本上是上面使用 rtspclientsink 而不是 autovideosink):

gst-launch-1.0 udpsrc port=5005 buffer-size=200000 caps="application/x-rtp, media=(string)video, encoding-name=(string)H264, payload=(int)96" ! \
rtpjitterbuffer do-lost=true latency=400 ! \
rtph264depay ! \
h264parse ! queue2 use-buffering=true max-size-buffers=1000 max-size-bytes=0 max-size-time=0 ! \
avdec_h264 max-threads=8 ! \
videoconvert ! \
rtspclientsink protocols=tcp location=rtsp://127.0.0.1:8554/media1.amp latency=0

但是然后阅读它:

gst-launch-1.0 playbin uri=rtsp://127.0.0.1:8554/media1.amp latency=0 buffer-size=50000000 buffer-duration=5000000000

突然有 2 秒的延迟。 另外,尝试使用 ffplay 读取 uri 将产生绿线/断流,并且 VLC 直接拒绝读取它。

我做错了什么? 有更好的方法吗?

其他数据点:

  • 如果我直接将原始流接收到目标 rtspclientsink,playbin 会很好地读取它,不会增加延迟。但我需要 udp 桥接器。
  • 我可以直接将rtsp流下沉到udp,但是我无法从udpsrc读回它;将 udpsrc 下沉到 fakesink 显示时间戳,但实际上没有数据会经历其他任何事情。
  • rtspsrc 也将拒绝从 mediamtx (rtsp://127.0.0.1:8554/media1.amp) 读取 rtsp 流,无论我尝试什么管道。
udp gstreamer rtsp latency
1个回答
0
投票

所以,最后我找到了如何做到这一点。

RTSP -> UDP

gst-launch-1.0 rtspsrc location='rtsp://user:pwd@ip:port/axis-media/media.amp'  latency=0 ! \
rtph264depay ! \
h264parse ! \
rtph264pay config-interval=1 ! \
udpsink host=127.0.0.1 port=5005 sync=false

UDP -> RTSP

gst-launch-1.0 udpsrc port=5006 caps="application/x-rtp,media=(string)video,encoding-name=(string)H264,payload=(int)96" ! rtpjitterbuffer latency=50 ! \
    queue ! rtph264depay ! rtspclientsink protocols=tcp location=rtsp://ip:port/media.amp

当然要设置mediamtx来接收media.amp流,并将其配置为在端口上接收; 554 没有 sudo 就无法打开,至少在 Linux 上是这样。我将 8554 视为一种标准后备。

祝有需要的人好运。

© www.soinside.com 2019 - 2024. All rights reserved.