通过Gstreamer中的RTSP进行数据传输

通过Gstreamer中的RTSP进行数据传输,gstreamer,Gstreamer,更新:: 我想通过Gstreamer中的RTSP传输视频数据(H264) gst_rtsp_media_factory_set_launch (factory, "videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96 "); 我想要“videotestsrc!x264enc!rtph264pay name=pay0 pt=96”这个管道也可以用C编程代替直接命令 实际上,我有自定义管道,我想将此管道传递到GstRTSPMediaFactory

更新::

我想通过Gstreamer中的RTSP传输视频数据(H264)

 gst_rtsp_media_factory_set_launch (factory, "videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96 ");
我想要“videotestsrc!x264enc!rtph264pay name=pay0 pt=96”这个管道也可以用C编程代替直接命令

实际上,我有自定义管道,我想将此管道传递到GstRTSPMediaFactory

随着发射,我无法通过我的管道

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);
现在,我想使用RTSP来传输这个管道。我可以通过gst\u rtsp\u媒体\u工厂\u设置\u发布流媒体

但是我只想传递管道变量,并且必须流式传输视频

有可能吗?如果有,怎么可能

我修改了rtsp media factory.c,如下所示:

Added GstElement *pipeline in struct _GstRTSPMediaFactoryPrivate.
另外增加了两个函数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); 

}
以同样的方式,你也可以得到

最后在函数default\u create\u元素中代替gst\u parse\u launch

增加了这一行

element = priv->pipeline; // priv is of type GstRTSPMediaFactoryPrivate
return element; 
但我无法接收数据。 当我为rtpmp2pay设置pay0时,它正在工作

但它只起了一次作用。如果客户端停止并再次启动,则其不工作。为了工作,我再次重新启动服务器

有什么问题

** (rtsp_server:4292): CRITICAL **: gst_rtsp_media_new: assertion 'GST_IS_ELEMENT (element)' failed
这里有一些答案。 它根据评论讨论解决了主要问题,但请求另一个流(停止和启动客户端时)仍然存在问题

解决方案是为payloader元素添加适当的名称,如中所述:

管道描述应该包含名为payN的元素,每个元素一个 流(例如pay0、pay1等)。此外,为了增加每个流的兼容性 应具有可在payloader上配置的不同有效负载类型

因此,这必须更改为:

sink = gst_element_factory_make("rtph264pay", "pay0");
注意从sink->pay0更改元素的名称

对于停止客户端问题,我将检查这是否适用于解析版本。
如果是,则检查解析管道字符串(在rtsp服务器的原始源代码中)是否保存在任何位置,并在重新启动后重新使用。。您需要对此进行调试。

我不理解“我想要…”这句话-您想在非rtsp C代码中测试它吗?或者您是在询问C gstreamer RTSP代码的其余部分以使其正常工作?如果没有用的话,我猜你是在跟踪。请检查一下这个问题,我更新了它。如果你知道答案,请帮助我。好的,现在我明白了,我不知道答案。。似乎唯一的方法是通过_set_launch,否则您必须按照前面所述对GstRTSPMediaFactory进行子类化,以克服这个我修改过的rtsp media factory.c。在其结构中,我添加了一个GstElement*管道;变量,我通过调用函数集_pipeline将管道分配给它。但问题是当我通过管道=gst_pipeline_new(“p”);但当我通过pipeline=gst\u parse\u launch时,它能够发送数据。正如我在这里所问的那样,这两者之间有什么区别()当你为
sink=gst\u element\u factory\u make(“rtph264pay”,“pay0”)取适当的名称时会发生什么-GstRTSPMediaFactory依赖于一个事实,即payloader将由payXY命名。是的,这是正确的。但是如果我想流式传输视频,只需传递管道变量。如果你不介意,我更新了问题,请检查一下。