Gstreamer,rtspsrc和有效载荷类型

时间:2015-03-25 08:04:27

标签: gstreamer rtsp rtp

我在从特定摄像头检索rtsp流时遇到困难,因为摄像头提供的rtp有效负载类型为35(未分配), rtph264depay 插件接受的有效负载类型为范围[96-127]。结果是gstreamer显示如下错误:

<udpsrc0> error: Internal data flow error.
<udpsrc0> error: streaming task paused, reason not-linked (-1)

我测试的其他相机正在工作,因为它们定义了良好的有效载荷类型。

FFmpeg,MPlayer和其他工具播放流,虽然它们可能会显示未知类型的警告,例如在Mplayer中:

rtsp_session: unsupported RTSP server. Server type is 'unknown'

gstreamer中是否有任何方法可以伪造有效负载类型,忽略不匹配的属性,强制插件之间的链接或以其他方式为我的问题创建一个workaroud?

我使用的管道是:

gst-launcg-0.10 rtspsrc location="..." ! rtph264depay ! capsfilter caps="video/x-h264,width=1920,height=1080,framerate=(fraction)25/1" ! h264parse ! matroskamux ! filesink location="test.mkv"

2 个答案:

答案 0 :(得分:4)

我想出来并让它发挥作用。在这里发布答案,希望它可能有益于某人。有很多类似的问题,但他们缺乏正确的答案。

以下是诀窍:

GstElement* depay = gst_element_factory_make("rtph264depay", "video_demux");
assert(depay);
GstPad* depay_sink = gst_element_get_static_pad(depay, "sink");
GstCaps* depay_sink_caps = gst_caps_new_simple("application/x-rtp",
        "media", G_TYPE_STRING, "video",
        "encoding-name", G_TYPE_STRING, "H264",
        NULL);
gst_pad_use_fixed_caps(depay_sink);
gst_pad_set_caps(depay_sink, depay_sink_caps);
gst_object_unref(depay_sink);

它会覆盖 rtph264depay 插件的接收器上限以减少限制,现在只要它是 rtp < / strong>并具有 H.264 编码。

我不认为这可以通过gst-launch实现。

答案 1 :(得分:1)

此处记录的select-stream模块中有rtspsrc个信号http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-rtspsrc.html#GstRTSPSrc-select-stream

这是一个回调,您检查流,如果您返回true,gstreamer将SETUPPLAY流,如果您返回false,它将忽略它,这应该让你忽略不受支持的流,在我的情况下,我遇到了ONVIF元数据流的问题,它总是尝试播放它并且没有解析器,我真的希望gstreamer会忽略不能播放的流并使用它拥有的东西或至少一个标志来切换这种行为。