带大华摄像机的vnd.onvif.metadata / SetMetadataConfiguration

时间:2019-02-13 06:43:19

标签: soap rtsp rtp ip-camera onvif

是否可以在普通的大华相机型号上自定义vnd.onvif.metadata RTSP轨道(在ONVIF Streaming SpecificationONVIF Analytics Service Specification中定义)?到底如何我想添加事件以及默认情况下似乎支持的分析数据。

我能够将其与海康威视相机配合使用。

我认为我需要使用ONVIF Media Service Specification中定义的SetMetadataConfiguration进行配置。

(顺便说一句,我也尝试过ONVIF拉点通知,但是我不喜欢它们。它们提供的信息并不丰富(没有每单元运动信息)。而且大华相机显然有一个可怕的问题)。错误,他们可以将超时时间提前10倍,所以不久以后就可以了,如果我的程序崩溃了,我基本上会泄漏订阅。如果发生五次,我就必须重新启动相机。无论如何,仅将RTSP流用于内容流。)

我在ONVIF Application Programmer's Guide中看到,第7.6节讨论了设置元数据流,并且B.4.6.4和B.4.6.5分别具有GetMetadataConfigurationSetMetadataConfiguration对。但是,用我的大华或海康威视相机似乎做不到同样的事情。

我在Genius Vision的ONVIF实施常见问题解答中找到了一篇名为How to support event notification under ONVIF spec的文章,其中说没有任何供应商实际支持,但是基本上我希望他们的信息过时或不正确。


大华

我正在使用运行固件2.622.0000000.18.R的Dahua IPC-HDW5231R-Z进行测试。它确实向我的rtsp客户端报告了vnd.onvif.metadata条跟踪。也就是说,我可以运行类似于一个建议的here的ffmpeg命令:

ffmpeg -loglevel verbose -hide_banner -dump -hex -allowed_media_types data -rtsp_transport tcp -i 'rtsp://user:pass@192.168.5.108/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif' -map 0:d -f data -c copy /dev/null -y

并设置流。我看到了一些东西,但没有看到我收到的拉动消息(例如时间调整)。

这是我收到的东西:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<tt:MetadataStream xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2">
  <tt:VideoAnalytics>
    <tt:Frame UtcTime="2019-02-21T16:20:06Z">
      <tt:Transformation>
        <tt:Translate x="-1" y="-1"/>
        <tt:Scale x="0.00625" y="0.00834"/>
      </tt:Transformation>
      <tt:Extension>
        <tt:MotionInCells Columns="22" Rows="18" Cells="zwA="/>
      </tt:Extension>
    </tt:Frame>
  </tt:VideoAnalytics>
  <tt:Event>
    <wsnt:NotificationMessage>
      <wsnt:Topic Dialect="http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet">tns1:RuleEngine/CellMotionDetector/Motion</wsnt:Topic>
      <wsnt:Message>
        <tt:Message UtcTime="2019-02-21T16:20:06Z" PropertyOperation="Changed">
          <tt:Source>
            <tt:SimpleItem Name="VideoSourceConfigurationToken" Value="000"/>
            <tt:SimpleItem Name="VideoAnalyticsConfigurationToken" Value="000"/>
            <tt:SimpleItem Name="Rule" Value="000"/>
          </tt:Source>
          <tt:Data>
            <tt:SimpleItem Name="IsMotion" Value="true"/>
          </tt:Data>
        </tt:Message>
      </wsnt:Message>
    </wsnt:NotificationMessage>
  </tt:Event>
</tt:MetadataStream>

这是相机发出的GetMetadataConfigurations响应(通过XML格式化程序发送,以提高可读性):

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<s:Envelope xmlns:sc="http://www.w3.org/2003/05/soap-encoding" xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
  <s:Header/>
  <s:Body>
    <trt:GetMetadataConfigurationsResponse>
      <trt:Configurations token="000" CompressionType="None">
        <tt:Name>MetadataConfig_Channel1</tt:Name>
        <tt:UseCount>2</tt:UseCount>
        <tt:PTZStatus>
          <tt:Status>false</tt:Status>
          <tt:Position>false</tt:Position>
        </tt:PTZStatus>
        <tt:Analytics>true</tt:Analytics>
        <tt:Multicast>
          <tt:Address>
            <tt:Type>IPv4</tt:Type>
            <tt:IPv4Address>224.2.0.0</tt:IPv4Address>
          </tt:Address>
          <tt:Port>40020</tt:Port>
          <tt:TTL>64</tt:TTL>
          <tt:AutoStart>false</tt:AutoStart>
        </tt:Multicast>
        <tt:SessionTimeout>PT1M</tt:SessionTimeout>
      </trt:Configurations>
    </trt:GetMetadataConfigurationsResponse>
  </s:Body>
</s:Envelope>

这是我的SetMetadataConfiguration请求,为简单起见,该请求应为无操作(无实际更改)。不同的XML名称空间前缀,但是从上面的响应中复制了Configuration

POST /onvif/media_service HTTP/1.1
user-agent: reqwest/0.9.9
accept: */*
content-type: application/soap+xml
soapaction: "http://www.onvif.org/ver10/media/wsdl/SetMetadataConfiguration"
content-length: 2018
accept-encoding: gzip
host: 192.168.5.108

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
            xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
            xmlns:device="http://www.onvif.org/ver10/device/wsdl"
            xmlns:events="http://www.onvif.org/ver10/events/wsdl"
            xmlns:media="ttp://www.onvif.org/ver10/media/wsdl"
            xmlns:notification="http://docs.oasis-open.org/wsn/b-2"
            xmlns:onvif="http://www.onvif.org/ver10/schema"
            xmlns:s="http://www.w3.org/2003/05/soap-envelope">
  <s:Header>
    <wsse:Security mustUnderstand="true">...redacted...</wsse:Security>
  </s:Header>
  <s:Body>
    <media:SetMetadataConfiguration>
      <media:Configuration token="000" CompressionType="None">
        <onvif:Name>MetadataConfig_Channel1</onvif:Name>
        <onvif:UseCount>2</onvif:UseCount>
        <onvif:PTZStatus>
          <onvif:Status>false</onvif:Status>
          <onvif:Position>false</onvif:Position>
        </onvif:PTZStatus>
        <onvif:Analytics>true</onvif:Analytics>
        <onvif:Multicast>
          <onvif:Address>
            <onvif:Type>IPv4</onvif:Type>
            <onvif:IPv4Address>224.2.0.0</onvif:IPv4Address>
          </onvif:Address>
          <onvif:Port>40020</onvif:Port>
          <onvif:TTL>64</onvif:TTL>
          <onvif:AutoStart>false</onvif:AutoStart>
        </onvif:Multicast>
        <onvif:SessionTimeout>PT1M</onvif:SessionTimeout>
      </media:Configuration>
      <media:ForcePersistence>true</media:ForcePersistence>
    </media:SetMetadataConfiguration>
  </s:Body>
</s:Envelope>

相机根本不回复(而是断开HTTP连接),而我发出的其他(大多数是手工制作的)SOAP请求似乎在起作用。 (特别是,经过编辑的安全性部分使用的代码与在其他地方使用的代码相同,所以这可能不是问题。而且我至少已验证我正在发送格式正确的XML。)我认为我做错了很多,但是我我没看到也许我的相机根本不执行此操作...


海康威视

我正在使用运行固件V5.3.0内置150513的Lorex MCNB2151(又名海康威视DS-2CD2032)进行测试。

以下是GetMetadataConfiguration响应:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" xmlns:tev="http://www.onvif.org/ver10/events/wsdl" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:tst="http://www.onvif.org/ver10/storage/wsdl" xmlns:ter="http://www.onvif.org/ver10/error" xmlns:dn="http://www.onvif.org/ver10/network/wsdl" xmlns:tns1="http://www.onvif.org/ver10/topics" xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl" xmlns:wsoap12="http://schemas.xmlsoap.org/wsdl/soap12" xmlns:http="http://schemas.xmlsoap.org/wsdl/http" xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:wsadis="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:wsrf-bf="http://docs.oasis-open.org/wsrf/bf-2" xmlns:wsntw="http://docs.oasis-open.org/wsn/bw-2" xmlns:wsrf-rw="http://docs.oasis-open.org/wsrf/rw-2" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsrf-r="http://docs.oasis-open.org/wsrf/r-2" xmlns:trc="http://www.onvif.org/ver10/recording/wsdl" xmlns:tse="http://www.onvif.org/ver10/search/wsdl" xmlns:trp="http://www.onvif.org/ver10/replay/wsdl" xmlns:tnshik="http://www.hikvision.com/2011/event/topics" xmlns:hikwsd="http://www.onvifext.com/onvif/ext/ver10/wsdl" xmlns:hikxsd="http://www.onvifext.com/onvif/ext/ver10/schema">
  <env:Body>
    <trt:GetMetadataConfigurationResponse>
      <trt:Configuration token="MetaDataToken">
        <tt:Name>metaData</tt:Name>
        <tt:UseCount>0</tt:UseCount>
        <tt:PTZStatus>
          <tt:Status>false</tt:Status>
          <tt:Position>false</tt:Position>
        </tt:PTZStatus>
        <tt:Analytics>false</tt:Analytics>
        <tt:Multicast>
          <tt:Address>
            <tt:Type>IPv4</tt:Type>
            <tt:IPv4Address>0.0.0.0</tt:IPv4Address>
          </tt:Address>
          <tt:Port>8600</tt:Port>
          <tt:TTL>1</tt:TTL>
          <tt:AutoStart>false</tt:AutoStart>
        </tt:Multicast>
        <tt:SessionTimeout>PT5S</tt:SessionTimeout>
        <tt:AnalyticsEngineConfiguration/>
      </trt:Configuration>
    </trt:GetMetadataConfigurationResponse>
  </env:Body>
</env:Envelope>

(令人震惊的是,tt名称空间前缀从未定义,但我认为应该是http://www.onvif.org/ver10/schema。)

我可以发送一个SetMetadataConfiguration,它添加一个Events元素(并省略UseCount):

POST /onvif/Media HTTP/1.1
user-agent: reqwest/0.9.9
accept: */*
content-type: application/soap+xml
soapaction: "http://www.onvif.org/ver10/media/wsdl/SetMetadataConfiguration"
content-length: 2075
accept-encoding: gzip
host: 192.168.5.106

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
            xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
            xmlns:device="http://www.onvif.org/ver10/device/wsdl"
            xmlns:events="http://www.onvif.org/ver10/events/wsdl"
            xmlns:media="ttp://www.onvif.org/ver10/media/wsdl"
            xmlns:notification="http://docs.oasis-open.org/wsn/b-2"
            xmlns:onvif="http://www.onvif.org/ver10/schema"
            xmlns:s="http://www.w3.org/2003/05/soap-envelope">
  <s:Header>
    <wsse:Security mustUnderstand="true">...redacted...</wsse:Security>
  </s:Header>
  <s:Body>
    <media:SetMetadataConfiguration>
      <media:Configuration token="MetaDataToken">
        <onvif:Name>metaData</onvif:Name>
        <onvif:Events />
        <onvif:PTZStatus>
          <onvif:Status>false</onvif:Status>
          <onvif:Position>false</onvif:Position>
        </onvif:PTZStatus>
        <onvif:Analytics>false</onvif:Analytics>
        <onvif:Multicast>
          <onvif:Address>
            <onvif:Type>IPv4</onvif:Type>
            <onvif:IPv4Address>0.0.0.0</onvif:IPv4Address>
          </onvif:Address>
          <onvif:Port>8600</onvif:Port>
          <onvif:TTL>1</onvif:TTL>
          <onvif:AutoStart>false</onvif:AutoStart>
        </onvif:Multicast>
        <onvif:SessionTimeout>PT5S</onvif:SessionTimeout>
        <onvif:AnalyticsEngineConfiguration/>
      </media:Configuration>
      <media:ForcePersistence>true</media:ForcePersistence>
    </media:SetMetadataConfiguration>
  </s:Body>
</s:Envelope>

似乎接受了它; GetMetadataConfiguration的其他响应反映了我添加的onvif:Events元素。

然后我可以通过AddMetadataConfiguration将其添加到个人资料中:

POST /onvif/Media HTTP/1.1
Accept-Encoding: identity
Content-Length: 1232
Soapaction: "http://www.onvif.org/ver10/media/wsdl/AddMetadataConfiguration"
Host: 192.168.5.106
User-Agent: Python-urllib/2.7
Connection: close
Content-Type: application/soap+xml

<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:ns0="http://www.onvif.org/ver10/media/wsdl" xmlns:ns1="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"><SOAP-ENV:Header><wsse:Security mustUnderstand="true"...redacted...</wsse:Security></SOAP-ENV:Header><ns1:Body><ns0:AddMetadataConfiguration><ns0:ProfileToken>Profile_1</ns0:ProfileToken><ns0:ConfigurationToken>MetaDataToken</ns0:ConfigurationToken></ns0:AddMetadataConfiguration></ns1:Body></SOAP-ENV:Envelope>

然后我的与上面类似的ffmpeg命令真正起作用了!

0 个答案:

没有答案