如何从 QT 中的 RTSP 流中解析 ONVIF 元数据?

Posted

技术标签:

【中文标题】如何从 QT 中的 RTSP 流中解析 ONVIF 元数据?【英文标题】:How to parse an ONVIF metadata from RTSP stream in QT? 【发布时间】:2015-03-24 10:51:31 【问题描述】:

首先,我使用 QMediaPlayer 构建了一些示例,但它无法处理 RTSP 流(ubuntu 14.04 上的 GStreamer 0.10 存在问题)。

其他一些想法不起作用,所以我改用其他解决方案。

我已经基于 LibVLC 和 vlc-qt DemoPlayer 示例(QT 5.4.1)构建了一个 qt 播放器。

流效果很好,视频效果很好。

我想从 IP 摄像机的 RTSP 流中解析 ONVIF 元数据流(它发送一些简单的 xml 数据,其中包含有关对象移动等信息),并根据从流中收集的元数据绘制一些线条。

我在寻找获取该数据的正确位置时遇到了一些麻烦。

据我所知,LibVLC 忽略了流中无法解析的部分。

有没有人尝试做类似的事情并为我指明正确的方向,或者我走错了路并且有更好的解决方案?:)

【问题讨论】:

【参考方案1】:

使用gst-launch,您可以简单地使用此管道:

gst-launch-1.0 rtspsrc location=camera_uri ! application/x-rtp, media=application ! fakesink dump=true

您将在终端中获得相机元数据。 但是这个数据会有rtp包头。要删除它,您必须编写 depayloader 元素。 (我没有找到),只删除 rtp 标头。

depayloader处理方法示例:

static GstBuffer *
gst_rtp_xml_depay_process (GstRTPBaseDepayload * depayload, GstBuffer   *   buf)

  guint8 *payload;
  GstRTPBuffer rtp =  NULL ;
  GstRtpXMLDepay *rtpxmldepay;
  rtpxmldepay = GST_RTP_XML_DEPAY (depayload);
  gst_rtp_buffer_map (buf, GST_MAP_READ, &rtp);
  payload = (guint8*)gst_rtp_buffer_get_payload_buffer (&rtp);
  return (GstBuffer*)payload;

如果你想在你的应用中获取元数据,你可以使用appsink。

【讨论】:

谢谢,我花了一整天的时间寻找! ;-) 你拯救了这一天!作为参考:我使用 G722 depayloader 的代码作为模板,将 depay_process 替换为您建议的代码。它就像一个魅力。谢谢。【参考方案2】:

您需要以某种方式附加到 GStreamer 信号“handle-request”,如此处所述:

http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-rtspsrc.html#GstRTSPSrc-handle-request

您需要的数据应该包含在 user_data 指针中。

【讨论】:

以上是关于如何从 QT 中的 RTSP 流中解析 ONVIF 元数据?的主要内容,如果未能解决你的问题,请参考以下文章

网络中的 ONVIF / RTSP / RTMP 协议 URL

Onvif获取rtsp地址流程

RTSP-ONVIF协议安防视频监控流媒体服务解决方案EasyNVR在Windows重启时提示“进程意外终止”问题解析

RTSP/Onvif协议视频平台EasyNVR如何修改运行服务描述?

RTSP/Onvif网页无插件直播解决方案EasyNVR已对接第三方监管平台,如何实现本地端的互联网访问

RTSP/ONVIF协议视频平台EasyNVR启动服务报错“service not found”,该如何解决?