在 Gstreamer 中通过 RTSP 传输数据

Pra*_*tti 5 gstreamer

更新::

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

 gst_rtsp_media_factory_set_launch (factory, "videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96 ");
Run Code Online (Sandbox Code Playgroud)

我想要“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);
Run Code Online (Sandbox Code Playgroud)

现在,我想使用 RTSP 流式传输此管道。我可以使用 gst_rtsp_media_factory_set_launch 进行流式传输,

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

有可能吗,如果有的话如何?

我修改了 rtsp-media-factory.c 如下,

Added GstElement *pipeline in struct _GstRTSPMediaFactoryPrivate.
Run Code Online (Sandbox Code Playgroud)

并添加了另外两个函数 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); 

}
Run Code Online (Sandbox Code Playgroud)

同理得也。

最后代替函数 default_create_element 中的 gst_parse_launch,

添加了这一行

element = priv->pipeline; // priv is of type GstRTSPMediaFactoryPrivate
return element; 
Run Code Online (Sandbox Code Playgroud)

但我无法接收数据。当我为 rtpmp2pay 设置 pay0 时,它正在工作。

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

问题是什么?

** (rtsp_server:4292): CRITICAL **: gst_rtsp_media_new: assertion 'GST_IS_ELEMENT (element)' failed
Run Code Online (Sandbox Code Playgroud)

nay*_*ana 1

在这里得到一些答案。它根据评论讨论解决了主要问题,但请求另一个流仍然存在问题(当停止和启动客户端时)。

解决方案是为有效负载元素添加正确的名称,如文档中所述:

管道描述应包含名为 payN 的元素,每个流对应一个元素(例如 pay0、pay1...)。此外,为了提高兼容性,每个流应该具有不同的负载类型,可以在负载器上进行配置。

所以这必须改为:

sink = gst_element_factory_make("rtph264pay", "pay0");
Run Code Online (Sandbox Code Playgroud)

请注意元素名称从接收器 -> pay0 的变化。

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