vnd.onvif.metadata / SetMetadataConfiguration с камерами Dahua - PullRequest
0 голосов
/ 13 февраля 2019

Можно ли настроить vnd.onvif.metadata дорожку RTSP (как определено в спецификации потоковой передачи ONVIF и в сервисной аналитике ONVIF ) на распространенных моделях камер Dahua?Как именно?Я хочу добавить события, а также иметь аналитические данные, которые он поддерживает по умолчанию.

Я могу настроить их на работу с камерой Hikvision.

Я считаю, что мне нужно настроитьэто с SetMetadataConfiguration, как определено в Спецификации службы мультимедиа ONVIF .

(кстати, я также пробовал уведомления о точке входа ONVIF, но они мне не понравились. Информацияони дают не так много (нет информации о движении на ячейку). И камеры Dahua, очевидно, имеют ужасную ошибку, когда они увеличивают тайм-аут в 10 раз в реальном времени, так что вскоре это далеко в будущем, и я в основном утечки подписки, если мойпрограмма аварийно завершает работу. Затем я должен перезагрузить камеру, если это произойдет пять раз. Грр. В любом случае кажется гораздо более естественным просто использовать поток RTSP для потоков данных.)

Я вижу в ONVIFРуководство по прикладному программированию , в разделе 7.6 говорится о настройке потоковой передачи метаданных, а в B.4.6.4 и B.4.6.5 соответственно есть пары GetMetadataConfiguration и SetMetadataConfiguration.Но то же самое, похоже, не работает с моими камерами Dahua или Hikvision.

Я нашел статью в FAQ по внедрению ONVIF Genius Vision под названием Как поддерживать уведомление о событии в спецификации ONVIF , котораяговорит, что ни один из поставщиков на самом деле не поддерживает это, но в основном я надеюсь, что их информация устарела или неверна.


Dahua

Я тестирую с Dahua IPC-HDW5231R-Z , работает прошивка 2.622.0000000.18.R.Он сообщает трек vnd.onvif.metadata моему клиенту rtsp.То есть я могу запустить команду 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.) Я думаю, что сделал что-то глубоко неправильное, но я 'Я не вижу этого.Или, может быть, моя камера просто не выполняет эту операцию вообще ...


Hikvision

Я тестирую на Lorex MCNB2151, он же Hikvision DS-2CD2032, под управлением прошивки V5.3.0 build 150513.

Вот ответ 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, аналогичная приведенной вышена самом деле работает!

...