GStreamer RTSP Pipeline doesn't work on MediaMTX 1.8
lqbrqt opened this issue · comments
Which version are you using?
v1.8.0
Which operating system are you using?
- Linux amd64 standard
- Linux amd64 Docker
- Linux arm64 standard
- Linux arm64 Docker
- Linux arm7 standard
- Linux arm7 Docker
- Linux arm6 standard
- Linux arm6 Docker
- Windows amd64 standard
- Windows amd64 Docker (WSL backend)
- macOS amd64 standard
- macOS amd64 Docker
- Other (please describe)
Describe the issue
Description
When running MediaMTX v1.5.1 using the same config, GStreamer pipeline starts on event runOnReady. When using MediaMTX v1.8.0 it fails with
ERROR: from element /GstPipeline:pipeline0/GstRTSPClientSink:rtspclientsink0: Could not read from resource.
Additional debug info:
../gst/rtsp-sink/gstrtspclientsink.c(3123): gst_rtsp_client_sink_send (): /GstPipeline:pipeline0/GstRTSPClientSink:rtspclientsink0:
Got error response: 400 (Bad Request).
Execution ended after 0:00:01.071807791
Setting pipeline to NULL ...
In attached files there is a config used with both MediaMTX versions.
mediamtx config.txt
Also, in attached files there are logs from both versions of MediaMTX
Describe how to replicate the issue
- Use provided config
- Run MediaMTX v1.8.0
Camera used in reproduction pipeline is AXIS 221
Did you attach the server logs?
yes
Did you attach a network dump?
no
I'm having the same issue with the Docker image;
docker run --rm -it --network=host bluenviron/mediamtx:latest
I get the same error when running
gst-launch-1.0 filesrc location=video.mp4 ! qtdemux name=d d.video_0 ! rtspclientsink location=rtsp://127.0.0.1:8554/mystream
Output log
Setting pipeline to PAUSED ...
Progress: (open) Opening Stream
Pipeline is PREROLLED ...
Prerolled, waiting for progress to finish...
Progress: (connect) Connecting to rtsp://127.0.0.1:8554/mystream
ERROR: from element /GstPipeline:pipeline0/GstRTSPClientSink:rtspclientsink0: Could not open resource for reading and writing.
Additional debug info:
../subprojects/gst-rtsp-server/gst/rtsp-sink/gstrtspclientsink.c(3305): gst_rtsp_client_sink_connect_to_server (): /GstPipeline:pipeline0/GstRTSPClientSink:rtspclientsink0:
Failed to connect. (Generic error)
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...
I also can't see any listener on port 8554
lsof -nP -i | grep 8554
If I run not in host mode and expose the ports I get slightly further, specifically getting a new error ERROR: from element /GstPipeline:pipeline0/GstRTSPClientSink:rtspclientsink0: Could not get/set settings from/on resource.
. This way I do see the service listening on TCP 8554.
docker run --rm -it \
-e MTX_PROTOCOLS=tcp \
-e MTX_WEBRTCADDITIONALHOSTS=192.168.x.x \
-p 8554:8554 \
-p 1935:1935 \
-p 8888:8888 \
-p 8889:8889 \
-p 8890:8890/udp \
-p 8189:8189/udp \
bluenviron/mediamtx
Output log
Setting pipeline to PAUSED ...
Progress: (open) Opening Stream
Progress: (connect) Connecting to rtsp://127.0.0.1:8554/mystream
Pipeline is PREROLLED ...
Prerolled, waiting for progress to finish...
Progress: (open) Retrieving server options
Progress: (open) Opened Stream
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Progress: (request) Sending RECORD request
Progress: (record) Sending server stream info
Progress: (request) SETUP stream 0
Redistribute latency...
Redistribute latency...
ERROR: from element /GstPipeline:pipeline0/GstRTSPClientSink:rtspclientsink0: Could not get/set settings from/on resource.
Additional debug info:
../subprojects/gst-rtsp-server/gst/rtsp-sink/gstrtspclientsink.c(4307): gst_rtsp_client_sink_setup_streams (): /GstPipeline:pipeline0/GstRTSPClientSink:rtspclientsink0:
Could not setup transport.
Execution ended after 0:00:00.003751000
Setting pipeline to NULL ...
Freeing pipeline ...
Setting protocols=tcp
in rtspclientsink as per #2257 (comment) seems to fix it and the connection succeeds.
Reverting back to host networking, but forcing TCP protocol means we're back to the original issue
docker run --rm -it --network=host -e MTX_PROTOCOLS=tcp -e MTX_WEBRTCADDITIONALHOSTS=192.168.x.x bluen
viron/mediamtx:latest
@lqbrqt the runOnReady
command you are using needs to be edited, you need to change $MTX_PATH_DELAY
into ${MTX_PATH}_delay
:
runOnReady: >
gst-launch-1.0 rtspsrc location=rtsp://127.0.0.1:8554/$MTX_PATH latency=0
! rtpmp4vdepay
! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 min-threshold-time=0
! rtspclientsink protocols=tcp location=rtsp://127.0.0.1:8554/${MTX_PATH}_delay
This is because since #3044 environment variables in commands are now replaced by using os.Expand()
instead of strings.ReplaceAll()
.