Steve Osborne
Steve Osborne

Reputation: 680

Separate RTSP payloads from gst-rtsp-server

I have an RTSP video source (h265) which I can display using VLC. I would like to split the stream into two, one at native resolution (encoded with h265) and the other at a new, lower resolution (encoded with h264). Both of the new streams should also be RTSP streams, viewable with VLC.

Due to bandwidth considerations, I can only connect a single client to the primary source.

So far, I have a working gst-rstp-server setup, with a single media factory running this gst launch string:

rtspsrc location=... ! rtph265depay ! h265parse ! tee name=t ! queue ! rtph265pay name=pay1 pt=96 t. ! queue ! decodebin ! videoscale ! videorate ! video/x-raw,framerate=30/1,width=640,height=480 ! x264enc bitrate=500 speed-preset=superfast tune=zerolatency ! h264parse ! rtph264pay name=pay0 pt=96

I set up a mount point for the media factory and can connect to VLC, eg. "rtsp://127.0.0.1:8550/test". With this, I can only get whichever substream is pay0 in VLC. I can see that both substreams are working by changing which one is pay0. But how can I have VLC show my pay1?

Otherwise, how can I tee the original video source, then have two different media factories (with different gst launch strings...) use the tee's as their own source?

Upvotes: 3

Views: 2778

Answers (1)

theUser
theUser

Reputation: 1396

Both streams are being sent to you at the same time. Usually the case for pay0 & pay1, would be sending video & audio. For your case where you want 2 separate video streams you will need to modify code.

A simple example of what you want to achieve can be done by modifying the file at gst-rtsp-server/examples/test-launch.c

  factory = gst_rtsp_media_factory_new ();
  gst_rtsp_media_factory_set_launch (factory, argv[1]);
  gst_rtsp_media_factory_set_shared (factory, TRUE);
  gst_rtsp_mount_points_add_factory (mounts, "/stream1", factory);

  gst_rtsp_media_factory_set_launch (factory, argv[2]);
  gst_rtsp_media_factory_set_shared (factory, TRUE);
  gst_rtsp_mount_points_add_factory (mounts, "/stream2", factory);

Then start with ./test-launch "rtspsrc location=... ! rtph265depay ! h265parse ! rtph265pay name=pay1 pt=96" "rtspsrc location=... ! rtph265depay ! h265parse ! decodebin ! videoscale ! videorate ! video/x-raw,framerate=30/1,width=640,height=480 ! x264enc bitrate=500 speed-preset=superfast tune=zerolatency ! h264parse ! rtph264pay name=pay0 pt=96"

You would then have 2 consumers on your camera though. If you prefer to only consume once, it would be up to you to T the stream & make it available as the src for your gst_rtsp_media_factory_set_launch pipeline.

Upvotes: 1

Related Questions