Как вручную найти URL-адрес видеопотока камер ONVIF?

Как вручную найти URL-адрес видеопотока камер ONVIF?

Я вижу, чтоДиспетчер устройств ONVIFнаходит URL потока совместимых камер. Но как это сделать? Есть ли метод для нахождения путей RTSP камер ONVIF?

решение1

СогласноОсновная спецификация ONVIF, у устройства, совместимого с ONVIF, точка входа управления устройством зафиксирована на http://${HOST}:${PORT}/onvif/device_service.

Эта конечная точка используется для взаимодействия устройств с помощьюДействия/операции/команды SOAP.

Еще одна спецификация:Спецификация медиасервиса ONVIF, определяет операции для запроса поддерживаемых устройствомпрофили.

TheПолучитьПрофилиКоманда предоставляет обзор всех профилей, которые может предложить устройство. Вот примерПолучитьПрофиливызов с использованием curlxmllintдля наглядной печати ответа):

curl -X POST http://192.168.178.22:8080/onvif/device_service\
 -H 'Content-Type: application/soap+xml; charset=utf-8'\
 -H 'SOAPAction: "http://www.onvif.org/ver10/media/wsdl/GetProfiles"'\
 -d '
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsdl="http://www.onvif.org/ver10/media/wsdl">
  <soap:Header/>
  <soap:Body>
    <wsdl:GetProfiles/>
   </soap:Body>
</soap:Envelope>
' | xmllint --format -

Мое устройство ONVIF отвечает на эту команду следующим образом (сокращенно):

<SOAP-ENV:Envelope ...>
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <trt:GetProfilesResponse>
      <trt:Profiles token="h264_ulaw_1920x1080" fixed="true">
        <tt:Name>h264_ulaw_1920x1080</tt:Name>
        <tt:VideoSourceConfiguration token="1920x1080_Config">
          <tt:Name>1920x1080_Config</tt:Name>
          <tt:UseCount>1</tt:UseCount>
          <tt:SourceToken>1920x1080</tt:SourceToken>
          <tt:Bounds x="0" y="0" width="1920" height="1080"/>
        </tt:VideoSourceConfiguration>
        <tt:AudioSourceConfiguration token="MicrophoneConfig">
          <tt:Name>MicrophoneConfig</tt:Name>
          <tt:UseCount>1</tt:UseCount>
          <tt:SourceToken>Microphone</tt:SourceToken>
        </tt:AudioSourceConfiguration>
        <tt:VideoEncoderConfiguration token="h264">
          <tt:Name>h264</tt:Name>
          <tt:UseCount>1</tt:UseCount>
          <tt:Encoding>H264</tt:Encoding>
          <tt:Resolution>
            <tt:Width>1920</tt:Width>
            <tt:Height>1080</tt:Height>
          </tt:Resolution>
          <tt:Quality>0</tt:Quality>
          <tt:RateControl>
            <tt:FrameRateLimit>30</tt:FrameRateLimit>
            <tt:EncodingInterval>1</tt:EncodingInterval>
            <tt:BitrateLimit>2000</tt:BitrateLimit>
          </tt:RateControl>
          <tt:H264>
            <tt:GovLength>150</tt:GovLength>
            <tt:H264Profile>Baseline</tt:H264Profile>
          </tt:H264>
          <tt:Multicast>
            <tt:Address>
              <tt:Type>IPv4</tt:Type>
              <tt:IPv4Address>192.168.178.22:8080</tt:IPv4Address>
            </tt:Address>
            <tt:Port>8080</tt:Port>
            <tt:TTL>30</tt:TTL>
            <tt:AutoStart>false</tt:AutoStart>
          </tt:Multicast>
          <tt:SessionTimeout>PT00H00M30S</tt:SessionTimeout>
        </tt:VideoEncoderConfiguration>
        <tt:AudioEncoderConfiguration token="AudioEncoder">
          <tt:Name>AudioEncoder</tt:Name>
          <tt:UseCount>0</tt:UseCount>
          <tt:Encoding>G711</tt:Encoding>
          <tt:Bitrate>1</tt:Bitrate>
          <tt:SampleRate>8000</tt:SampleRate>
          <tt:Multicast>
            <tt:Address>
              <tt:Type>IPv4</tt:Type>
              <tt:IPv4Address>192.168.178.22:8080</tt:IPv4Address>
            </tt:Address>
            <tt:Port>8080</tt:Port>
            <tt:TTL>30</tt:TTL>
            <tt:AutoStart>false</tt:AutoStart>
          </tt:Multicast>
          <tt:SessionTimeout>PT00H00M30S</tt:SessionTimeout>
        </tt:AudioEncoderConfiguration>
      </trt:Profiles>
      <trt:Profiles token="jpeg_ulaw_1920x1080" fixed="true">
        <!-- -->
      </trt:Profiles>
      <trt:Profiles token="h264_opus_1920x1080" fixed="true">
        <!-- -->
      </trt:Profiles>
      <trt:Profiles token="jpeg_opus_1920x1080" fixed="true">
        <!-- -->
      </trt:Profiles>
    <!-- -->
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

ИтакПолучитьПрофилиответ содержит кучу Profilesэлементов. Обратите внимание на tokenзначение атрибута каждого Profilesэлемента, например <Profiles token="h264_ulaw_1920x1080" fixed="true">. Эти токены можно использовать для последующих запросов с помощьюGetStreamUriкоманда:

curl -X POST http://192.168.178.22:8080/onvif/device_service\
 -H 'Content-Type: application/soap+xml; charset=utf-8'\
 -H 'SOAPAction: "http://www.onvif.org/ver10/media/wsdl/GetStreamUri"'\
 -d '
<soap:Envelope
  xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
  xmlns:wsdl="http://www.onvif.org/ver10/media/wsdl"
>
  <soap:Header/>
  <soap:Body>
    <wsdl:GetStreamUri>
      <wsdl:ProfileToken>h264_ulaw_1920x1080</wsdl:ProfileToken>
    </wsdl:GetStreamUri>
  </soap:Body>
</soap:Envelope>
' | xmllint --format -

... на что мое устройство отвечает (сокращенно):

<SOAP-ENV:Envelope ...>
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <trt:GetStreamUriResponse>
      <trt:MediaUri>
        <tt:Uri>rtsp://192.168.178.22:8080/h264_ulaw.sdp</tt:Uri>
        <tt:InvalidAfterConnect>false</tt:InvalidAfterConnect>
        <tt:InvalidAfterReboot>false</tt:InvalidAfterReboot>
        <tt:Timeout xsi:nil="true"/>
      </trt:MediaUri>
    </trt:GetStreamUriResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

И вот что у нас получилось: URL-адрес видеопотока содержится в <Uri>элементе: rtsp://192.168.178.22:8080/h264_ulaw.sdp.

(Обзор спецификаций сетевого интерфейса ONVIF)

Связанный контент