在 Gstreamer 中通过 RTSP 传输数据

Data Transfer through RTSP in 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。

启动后我无法通过我的管道。

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_rtsp_media_factory_set_launch、

进行直播

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

这可能吗,如果可能的话怎么办?

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

Added GstElement *pipeline in struct _GstRTSPMediaFactoryPrivate.

并且添加了另外两个函数get_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_create_element、

中代替了 gst_parse_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

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

解决方案是按照 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.

因此必须将其更改为:

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

注意来自 sink -> pay0 的元素名称的变化。

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