我在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);
...
此管道应由GstRTSPMediaFactory启动。我在这里遇到的问题是gst_rtsp_media_factory_set_launch
函数只接受const gchar *
管道。
因此,我的问题是,如果你们中的任何人都知道
的功能GstElement *pipeline
转换为const gchar*
表示(有点反向gst_parse
)GstElement *pipeline
启动GstRTSPMediaFactory(参见下面的编辑#1)非常感谢任何帮助!谢谢。
编辑#1:
来自gst-rtsp-server documentation:
GstRTSPMediaFactory的默认实现允许您轻松创建 使用gst-launch语法的GStreamer管道。有可能创建一个 GstRTSPMediaFactory子类,使用不同的方法进行构造 管道
因此,从GstElement启动GstRTSPMediaFactory在技术上是可行的。此方法的其他问题:是否有人知道这样的GstRTSPMediaFactory子类实现?
答案 0 :(得分:0)
是的,gst-rtsp-server
存储库的子文件夹示例中有an example。总结一下:制作GstRTSPMediaFactory
的子类并覆盖create_element()
虚拟方法。
顺便说一句,这也意味着您之前提供的2个选项不正确;
- 将GstElement 管道转换为const gchar 表示形式(反向gst_parse)
这是不可能的,因为程序化API具有更高的表现力,并且比声明性启动API允许您做更多的事情(甚至是一个简单的示例:注册回调)。
- 或从GstElement *管道启动GstRTSPMediaFactory(请参见下面的编辑#1)
您正在考虑另一种方法:当GStreamer RTSP服务器收到开始播放的请求时,它将根据您的GstRTSPMediaFactory
实现,使用GstPipeline
启动get_element()
。与此相反,每个管道都在其中启动其自己的RTSP服务器。