我需要通过 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 直接拒绝读取它。
我做错了什么? 有更好的方法吗?
其他数据点:
所以,最后我找到了如何做到这一点。
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 视为一种标准后备。
祝有需要的人好运。