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
答案 0 :(得分:1)
在这里有一些答案。 它根据评论讨论解决了主要问题,但是仍然存在请求另一个流的问题(停止和启动客户端时)。
解决方案是为docs中所述的payloader元素添加适当的名称:
管道描述应包含名为payN的元素,每个元素对应一个 流(例如pay0,pay1,......)。此外,为了增加每个流的兼容性 应该有一个不同的有效负载类型,可以在payloader上配置。
所以这必须改为:
sink = gst_element_factory_make("rtph264pay", "pay0");
注意来自接收器的元素名称的更改 - > pay0。
对于停止客户端问题,我会检查这是否适用于解析版本。 如果是,则检查解析管道字符串(在rtsp服务器的原始源代码中)是否保存在任何地方并在重新启动后重新使用..您需要调试它。