【问题标题】:Data Transfer through RTSP in Gstreamer在 Gstreamer 中通过 RTSP 传输数据
【发布时间】:2015-12-01 03:41:55
【问题描述】:

更新::

我想在 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 & 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_create_element 中的 gst_parse_launch,

添加了这一行

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

但我无法接收数据。 当我将 pay0 用于 rtpmp2pay 时,它正在工作。

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

有什么问题?

** (rtsp_server:4292): CRITICAL **: gst_rtsp_media_new: assertion 'GST_IS_ELEMENT (element)' failed

【问题讨论】:

  • 我不明白“我想要..”这句话 - 你想用非 rtsp C 代码测试它吗?或者您是在询问其他 C gstreamer RTSP 代码以使其工作吗?我猜你正在关注this,如果它没有用的话..
  • 请检查问题一次,我更新了。如果你知道答案,请帮助我。
  • 好的,现在我明白了,但我不知道答案.. 似乎唯一的方法是通过 _set_launch,否则您必须按照 here 所述将 GstRTSPMediaFactory 子类化
  • 为了克服这个问题,我修改了 rtsp-media-factory.c。在它的结构中,我添加了一个 GstElement *pipeline;变量,我通过调用函数 set_pipeline 将我的管道分配给它。但问题是它无法发送数据,当我通过 pipeline = gst_pipeline_new("p");但是当我通过 pipeline = gst_parse_launch 时它能够发送数据。我在这里问这两者有什么区别(stackoverflow.com/questions/34042082/…
  • 当您为sink = gst_element_factory_make("rtph264pay", "pay0"); 输入正确名称时会发生什么 - GstRTSPMediaFactory 指望负载器将由 payXY 命名..

标签: gstreamer


【解决方案1】:

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

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

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

所以必须改成:

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

注意从 sink -> pay0 中元素名称的变化。

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

【讨论】:

  • 是的,没错。但如果我想流式传输视频,只需传递管道变量。如果你不介意,我更新了问题,请检查一次。
猜你喜欢
  • 2018-07-01
  • 2022-12-14
  • 2013-04-13
  • 1970-01-01
  • 2010-12-16
  • 2019-01-26
  • 1970-01-01
相关资源
最近更新 更多