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

时间:2015-12-01 03:41:55

标签: gstreamer

UPDATE ::

我想在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。

启动时,我无法通过我的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);

现在,我想使用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

1 个答案:

答案 0 :(得分:1)

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

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

  

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

所以这必须改为:

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

注意来自接收器的元素名称的更改 - > pay0。

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