如何从 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
RTSP-ONVIF协议安防视频监控流媒体服务解决方案EasyNVR在Windows重启时提示“进程意外终止”问题解析
RTSP/Onvif协议视频平台EasyNVR如何修改运行服务描述?