在 Gstreamer 中通过 RTSP 传输数据
Data Transfer through RTSP in Gstreamer
更新::
我想在 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 & 设置管道
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
在这里得到一些答案。
它根据评论讨论解决了主要问题,但是请求另一个流(停止和启动客户端时)仍然存在问题。
解决方案是按照 docs:
中所述为有效载荷元素添加适当的名称
The pipeline description should contain elements named payN, one for each
stream (ex. pay0, pay1, ...). Also, for increased compatibility each stream
should have a different payload type which can be configured on the payloader.
因此必须将其更改为:
sink = gst_element_factory_make("rtph264pay", "pay0");
注意来自 sink -> pay0 的元素名称的变化。
对于停止客户端的问题,我会检查这是否适用于解析版本。
如果是,则检查解析管道字符串(在 rtsp 服务器的原始源代码中)是否保存在任何地方并在重启后重新使用。你需要调试它。
更新::
我想在 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 & 设置管道
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
在这里得到一些答案。 它根据评论讨论解决了主要问题,但是请求另一个流(停止和启动客户端时)仍然存在问题。
解决方案是按照 docs:
中所述为有效载荷元素添加适当的名称The pipeline description should contain elements named payN, one for each stream (ex. pay0, pay1, ...). Also, for increased compatibility each stream should have a different payload type which can be configured on the payloader.
因此必须将其更改为:
sink = gst_element_factory_make("rtph264pay", "pay0");
注意来自 sink -> pay0 的元素名称的变化。
对于停止客户端的问题,我会检查这是否适用于解析版本。 如果是,则检查解析管道字符串(在 rtsp 服务器的原始源代码中)是否保存在任何地方并在重启后重新使用。你需要调试它。