Gstreamer、rtspsrc 和负载类型
Gstreamer, rtspsrc and payload type
我在从特定摄像头检索 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 中有没有什么方法可以伪造负载类型、忽略不匹配 属性、强制插件之间的链接或以其他方式创建解决我的问题的方法?
我使用的管道是:
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"
我弄明白了并开始工作。在这里发布一个答案,希望它可以使某人受益。那里有多个类似的问题,但他们缺乏正确的答案。
以下是诀窍:
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 并具有 H.264 编码。
我认为 gst-launch 不可能做到这一点。
此处记录的 rtspsrc
模块中有一个 select-stream
信号 http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-rtspsrc.html#GstRTSPSrc-select-stream
这是一个回调,您可以在其中检查流,如果您 return true
,gstreamer 将 SETUP
和 PLAY
流,如果您 return false
它会忽略它,这应该让你忽略不受支持的流,在我的例子中我遇到了 ONVIF 元数据流的问题,它总是尝试播放它并且没有解析器,我真的希望 gstreamer将忽略无法播放的流并使用它所拥有的或至少一个标志来切换该行为。
我在从特定摄像头检索 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 中有没有什么方法可以伪造负载类型、忽略不匹配 属性、强制插件之间的链接或以其他方式创建解决我的问题的方法?
我使用的管道是:
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"
我弄明白了并开始工作。在这里发布一个答案,希望它可以使某人受益。那里有多个类似的问题,但他们缺乏正确的答案。
以下是诀窍:
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 并具有 H.264 编码。
我认为 gst-launch 不可能做到这一点。
此处记录的 rtspsrc
模块中有一个 select-stream
信号 http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-rtspsrc.html#GstRTSPSrc-select-stream
这是一个回调,您可以在其中检查流,如果您 return true
,gstreamer 将 SETUP
和 PLAY
流,如果您 return false
它会忽略它,这应该让你忽略不受支持的流,在我的例子中我遇到了 ONVIF 元数据流的问题,它总是尝试播放它并且没有解析器,我真的希望 gstreamer将忽略无法播放的流并使用它所拥有的或至少一个标志来切换该行为。