是否可以在普通的大华相机型号上自定义vnd.onvif.metadata
RTSP轨道(在ONVIF Streaming Specification和ONVIF 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分别具有GetMetadataConfiguration
和SetMetadataConfiguration
对。但是,用我的大华或海康威视相机似乎做不到同样的事情。
我在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命令真正起作用了!