CCCマーケティング データベースマーケティング研究所の Tech Blog

研究所スタッフによる格闘記録やマーケティング界隈についての記事など

Onvifについて

こんにちは、技術開発ユニットの三浦です。画像解析の研究に使用するデータの収集のため、ネットワークカメラを利用することがあります。ネットワークカメラの仕様を色々と眺めていると「Onvif ProfileS」といった記述をよく見ます。今回はこの「Onvif」について調べてみた内容をご紹介したいと思います・・・が、調べ始めてみるとSOAP API等々自分の理解が浅い部分がたくさん見つかり、まだ完全には理解しきれておらず、もしかしたら間違った捉え方をしてしまっている点があるかもしれません。いったん自分がここまで理解した、ということを残すことを目的に、この記事を書いてみたいと思います。

Onvifとは

まずはOnvifの公式情報から、Onvifについて調べてみました。

www.onvif.org

Onvifは、IPをベースとしてネットワークセキュリティ製品同士が相互に効率的にやり取りするためのインターフェースの標準化を目的としたフォーラムです。2008年にAxis Communications, Bosch Security Systems, Sony Corporationによって設立されたそうです。Onvifに準拠した製品はこの標準化されたインターフェースを機能として備えており、製品を利用する開発者はたとえばIPを取得するのにDiscovery機能を使い、GetStreamURI()を呼び出せばRTSPで映像を受信するためのURIが取得できるな、と製品の違いによらず製品とやり取りするアプリケーションの開発を行うことができます。Onvifで定められた機能はいくつかのProfileに分けられており、たとえばネットワークカメラなどの映像を送信する製品向けの機能はProfile S、レコーダなどの映像を蓄積する製品向けの機能はProfile Gといったように分類されています。Onvifに適合した製品であれば、最低でも1つのProfileを満たしています。Profile SとProfile Gを満たしているネットワークカメラであれば、Onvifに準拠した映像配信機能と録画機能を持っているんだなといったことが分かります。

Onvifデバイスとの通信

ネットワークカメラなどのOnvifデバイスに対し、遠隔から設定情報を参照したり、設定したりするためにはSOAPというプロトコルを使用します。SOAPはWeb APIを構築する通信プロトコルで、XMLを使って情報のやり取りをします。XMLの構造はWSDL(Web Services Description Language)という、これまたXML形式のドキュメントで記述されています。APIを構築する手段としては他にもREST APIというものがありますが、普段RESTに慣れ親しんでいる(というかRESTしか知らない)自分にとって、SOAPでの通信はなかなか理解が難しいな・・・という印象です。

SOAPクライアント用のライブラリはPythonにもあるようなので、今度使ってみようと思います。

docs.python-zeep.org

WSDLの解読はライブラリ側でやってくれそうです。

具体的な実装方法

映像を受信したいネットワークカメラのIPアドレスを特定した後、以下の手順でRTSPによる映像の受信が行えるようです。

  1. 認証・通信のセットアップなどの事前の手続きをネットワークカメラと行う(プロトコル:SOAP)
  2. RTSPのURLを取得する(プロトコル:SOAP)
  3. 2で取得したURLからRTSPによる映像受信を行う(プロトコル:RTSP)

こちらから閲覧できる「ONVIF Application Programmer's Guide」に具体的なプログラムの例がいくつも掲載されているのでイメージが掴みやすかったです。特にStreamingに関するプログラム例は「7 Streaming」のChapterが参考になると思います。

まとめ

今回はネットワークカメラの仕様に記載されている「Onvif」がどういったものなのかを調べてみた内容をご紹介しました。調べてみた、といっても本当に表面的な内容に留まっているのでもう少し調査してみたいと思います。特に認証といったセキュリティ周りがどうなっているのかはしっかりと理解しておきたいので、また別の記事でご紹介したいと考えています。