Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Data Transfer through RTSP in Gstreamer

Tags:

gstreamer

UPDATE::

I want to stream video data (H264) through RTSP in Gstreamer.

 gst_rtsp_media_factory_set_launch (factory, "videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96 ");

I want "videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96" this pipeline would also be in C programming in place of direct command.

Actually I have custom pipeline, i want to pass this pipeline to GstRTSPMediaFactory.

With launch i am not able to pass my pipline.

source = gst_element_factory_make("videotestsrc", "test-source");
parse = gst_element_factory_make("x264enc", "parse");
sink = gst_element_factory_make("rtph264pay", "sink");
gst_bin_add_many(GST_BIN(pipeline), source, parse, sink, NULL);
gst_element_link_many(source, parse, sink, NULL);

Now, I want to stream this pipeline using RTSP. I can stream with gst_rtsp_media_factory_set_launch,

But i want to pass only pipeline variable, and has to stream the video.

Can it possible, if so How?

I Modified the rtsp-media-factory.c as follows,

Added GstElement *pipeline in struct _GstRTSPMediaFactoryPrivate.

And the Added two more functions get_pipeline & set pipeline

void
gst_rtsp_media_factory_set_launch_pipeline (GstRTSPMediaFactory * factory, GstElement *pipeline)
{
  g_print("PRASANTH :: SET LAUNCH PIPELINE\n");
  GstRTSPMediaFactoryPrivate *priv;
  g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
  g_return_if_fail (pipeline != NULL);
  priv = factory->priv;
  GST_RTSP_MEDIA_FACTORY_LOCK (factory);
//  g_free (priv->launch);
  priv->pipeline = pipeline;
  Bin = priv->pipeline;
  GST_RTSP_MEDIA_FACTORY_UNLOCK (factory); 

}

In the Same way get also.

And at last in place of gst_parse_launch in function default_create_element,

added this line

element = priv->pipeline; // priv is of type GstRTSPMediaFactoryPrivate
return element; 

but I am not able to receive the data. When i put pay0 for rtpmp2pay it is working.

But it is working for once only. If Client stops and again starts its not working. To work it, again i am restarting the server.

What is the problem?

** (rtsp_server:4292): CRITICAL **: gst_rtsp_media_new: assertion 'GST_IS_ELEMENT (element)' failed
like image 701
Prasanth Kumar Arisetti Avatar asked Nov 09 '22 00:11

Prasanth Kumar Arisetti


1 Answers

To have some answer here. It solves the main problem according to comments discussion, but there is still problem with requesting another stream (when stopping and starting client).

The solution was to add proper name for payloader element as stated in docs:

The pipeline description should contain elements named payN, one for each stream (ex. pay0, pay1, ...). Also, for increased compatibility each stream should have a different payload type which can be configured on the payloader.

So this has to be changed to:

sink = gst_element_factory_make("rtph264pay", "pay0");

notice the change in name of element from sink -> pay0.

For the stopping client issue I would check if this works for parse version. If yes then check if the parse pipeline string (in original source code of rtsp server) is saved anywhere and reused after restart.. you need to debug this.

like image 68
nayana Avatar answered Jan 04 '23 01:01

nayana