8

我正在用 C 语言做一个 Gstreamer 1.0 应用程序。管道是根据运行时的用户配置和系统“状态”构建的。因此,我使用了多个 GstElement,这些 GstElement 后来被添加并链接到“GstElement 管道”。这是一个更好的理解的最小示例:

GstElement *pipeline = gst_pipeline_new("mypipeline");
...
GstElement *src = gst_element_factory_make("videotestsrc", NULL);
...
gst_bin_add_many(GST_BIN(pipeline), src, enc, pay, NULL);
gst_element_link_many(src, enc, pay, NULL);
...

然后应该由GstRTSPMediaFactory启动此管道。我在这里面临的问题是该gst_rtsp_media_factory_set_launch功能仅接受const gchar *管道。

因此,我的问题是,如果你们中的任何人都知道其中任何一个的功能

  • 将 转换GstElement *pipelineconst gchar*表示(有点相反gst_parse
  • 或从 a 启动 GstRTSPMediaFactory GstElement *pipeline(参见下面的编辑#1)

任何帮助深表感谢!谢谢你。


编辑#1:

gst-rtsp-server 文档

GstRTSPMediaFactory 的默认实现允许您使用 gst-launch 语法轻松创建 GStreamer 管道。可以创建使用不同方法构建管道的 GstRTSPMediaFactory 子类。

因此,从 GstElement 启动 GstRTSPMediaFactory 在技术上是可行的。这种方法的附加问题:有人知道这样的 GstRTSPMediaFactory 子类实现吗?

4

1 回答 1

1

是的,gst-rtsp-server存储库在其子文件夹示例中有一个示例。总结一下:创建一个子类GstRTSPMediaFactory并覆盖create_element()虚拟方法。

顺便说一句,这也意味着您之前提供的 2 个选项不正确;

  • 将 GstElement管道转换为 const gchar表示(有点反向 gst_parse)

这是不可能的,因为编程 API 比声明式启动 API 更具表现力,并且允许您做更多事情(甚至是一个简单的示例:注册回调)。

  • 或从 GstElement *pipeline 启动 GstRTSPMediaFactory(参见下面的编辑#1)

您正在考虑另一种方式:当 GStreamer RTSP 服务器收到开始播放的请求时,它将使用GstRTSPMediaFactory启动GstPipeline基于您的get_element()实现。不是相反,每个管道都会启动自己的 RTSP 服务器。

于 2020-06-05T12:35:34.040 回答