从GstElement管道启动GstRTSPServer

g0h*_*l1n 6 c rtsp gstreamer gstreamer-1.0

我在C中做了一个Gstreamer 1.0应用程序.管道是在运行时根据用户配置和系统"状态"构建的.因此我使用多个GstElements,后来添加并链接到"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);
...
Run Code Online (Sandbox Code Playgroud)

然后,该管道应由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子类实现?

小智 1

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

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

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

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

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

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