
Axis ネットワークカメラから RTSP で映像をリアルタイムにストリーミングする
最近、Axis® のネットワークカメラの検証を色々と行っています。
ノウハウがいくつか溜まってきたので、今回は RTSP でリアルタイムにストリーミングする方法を複数のパターンで紹介したいと思います。
なお、AXIS、AXIS COMMUNICATIONS、ETRAX、ARTPECおよびVAPIXは、スウェーデンおよびその他の国で登録されたAxis ABの登録商標です。
アイキャッチのロゴ画像は、Axis の許可を頂いて使わせていただいているものになります。
Axis のネットワークカメラとは??
まず最初にカメラの提供元である Axis について紹介したいと思います。
Axis は、1984 年にスウェーデンで設立された企業で、世界シェアトップ 3 に入るネットワークカメラのリーディングカンパニーです。また、2015年には日本の大手カメラメーカーであるキヤノン株式会社のグループ参加となり、実は身近な企業であることを知りました。
Axis のネットワークカメラは非常に多機能で、AI 処理を行ったり、カメラに映ったものをトリガーに各種処理を実行したり、MQTT による通信も可能です。またデベロッパー向けの SDK も提供されていて、ユーザー自身が追加機能を独自開発できる点もとても魅力的です。
さらに、ドキュメントを見ると AWS の各種サービスにも連携する方法も紹介されており活用の幅の広さを感じます。AWS 連携については別途紹介していきたいと思います。
RTSP (Real Time Streaming Protocol) とは?
今回利用する RTSP について簡単に紹介します。
RTSPとは、「Real Time Streaming Protocol」 の略で、ネットワークカメラ、監視システム、ライブストリーミングなど、音声や映像をリアルタイムに配信する際に広く使用されています。
今回利用するカメラも RTSP プロトコルをサポートしています。RTSP サーバを自分で作ることもできるので、ラズベリーパイにカメラをつなげてリモートから映像を見ることも簡単にできます。
検証に利用するカメラ機種
今回利用するカメラは 「AXIS F9114-R Mk II Main Unit」 という機種です。
カメラの機種によっては RTSP をサポートしていないものもあるので、本記事で紹介する内容を試される場合は、事前に機種の仕様をご確認ください。
また、カメラの機種やバージョンによっても設定や確認箇所が変わる場合がありますので、本記事と異なる場合はあらかじめご了承ください。
それでは、次から検証作業の内容を見ていきたいと思います。
カメラの RTSP エンドポイントを確認する
このカメラにはブラウザで利用できる管理画面が用意されており、RTSP の URL も管理画面上で確認することができます。
管理画面のメニューから 「ビデオ」 にある項目をいずれかクリックして設定画面を開きます。ここでは 「ストリーム」 の画面を開いています。
この画面の下側にある 「ライブビューの設定」(歯車のアイコン) をクリックします。
(画面の右上と左下の黒い部分は、「プライバシーマスク」 というカメラの機能を使って映像をマスキングしているものです。)
ライブビューの設定画面が開くので、「クライアントのストリーム情報」 のトグルをスライドして有効にします。
すると、「クライアントのストリーム情報」 というウィンドウが開き、RTSP の URL を確認することができます。
このカメラの RTSP URL の基本的な形は次のとおりです。
rtsp://[カメラの IP アドレス or ホスト名]/axis-media/media.amp
具体的には、例えば次のような URL になります。
rtsp://192.168.40.135/axis-media/media.amp
上記の URL でもアクセスできますが、管理画面からコピーした URL にはいくつかのパラメーターが含まれたものになっていて、カメラの ID や解像度などが指定されています。
このパラメーターは 管理画面上で映っている映像に対するパラメーター がセットされています。そのため管理画面上でカメラ映像を切り替えたり、解像度を変更すると取得できるパラメーターも変わります。
rtsp://192.168.40.135/axis-media/media.amp?camera=2&videoframeskipmode=empty&videozprofile=classic&resolution=1920x1080&fps=30×tamp=0&videocodec=h264
管理画面からコピーした URL には認証情報は含まれていません。コマンドラインからカメラにアクセスする場合など、必要に応じて認証情報を含んだ URL に修正して利用します。
rtsp://user:password@192.168.40.135/axis-media/media.amp
なお、カメラ ID が URL のパラメーターに入っていない場合、「カメラ1」の映像がストリーミングされました。ここはまだ詳細な仕様を確認できていないので後ほど調べようと思います。
いろんな RTSP クライアントでストリーミング映像を確認する
RTSP の URL が分かったので、いくつかのクライアントで映像を確認してみたいと思います。
VLC media player で試す
最初は、動画再生ソフトとして有名な 「VLC media player で確認します。
メニューバーから 「メディア」-「ネットワークストリームを開く」 をクリックします。
「ネットワーク」 タブを開いて、先程カメラ上で確認した RTSP URL をセットします。(下記 の URL は一例です)
「再生」ボタンを押せば別のウィンドウが開いて、カメラの映像がストリーミングされていることを確認できます。
もし URL 中の認証情報を省略した場合は、次のように入力を求められます。
ffplay コマンドで試す
次にコマンドラインから確認してみます。先程は Windows マシン上の VLC media player を使っていました。
今度は Mac に ffplay コマンドをインストールしてアクセスしてみます。
ffplay
がインストールされていない場合は、次のコマンドでインストールしてください。
ffmpeg のインストールで ffplay も一緒にインストールされます。
brew install ffmpeg
インストールできたら、RTSP URL に対して ffplay コマンドを実行します。
ffplay "rtsp://user:password@192.168.40.135/axis-media/media.amp"
コマンドラインやアプリケーションからアクセスするとき、パスワード認証がかかっている場合は URL にパスワードを含めておきます。
認証情報を URL に含めない場合、VLC media player などのデスクトップアプリケーションであれば、認証情報の入力を促す画面が出てくることがありますが、コマンドラインなどから使う場合は認証エラーになります。
[rtsp @ 0x126830500] method DESCRIBE failed: 401 Unauthorized
rtsp://192.168.40.135/axis-media/media.amp: Server returned 401 Unauthorized (authorization failed)
また、ユーザー名やパスワードに特殊記号などが入っていると正しく認識されないことが多い ので、下記のように環境変数に入れてしまうといいでしょう。
export RTSP_USERNAME='user-name'
export RTSP_PASSWORD='your-password'
ffplay "rtsp://${RTSP_USERNAME}:${RTSP_PASSWORD}@192.168.40.135/axis-media/media.amp"
カメラにアクセスできると、新たにウインドウが開きストリーミング映像を確認できます。
OpenCV で試す
最後に、OpenCV を使った python アプリから試してみます。
認証情報は先程と同じように環境変数として渡しています。
import os
import cv2
from urllib.parse import quote
username = quote(os.environ.get('RTSP_USERNAME', ''))
password = quote(os.environ.get('RTSP_PASSWORD', ''))
ENDPOINT = f'rtsp://{username}:{password}@192.168.40.135/axis-media/media.amp'
cap = cv2.VideoCapture(ENDPOINT)
while True:
retval, image = cap.read()
if retval:
cv2.imshow("Video", image)
if cv2.waitKey(1) == 27:
break
ffplay のときと同じように映像を確認できました。
ちなみに、冒頭で確認したRTSP の URLですが、すぐ側に HTTP URL も表示がありました。こちらの URL を使えばブラウザ上でカメラ映像を確認できます。
マルチカメラによる映像を確認する
今回試した機種は複数のカメラが装着されており、管理画面からカメラを切り替えて映像を確認することができます。
カメラを切り替えると、管理画面で確認できる RTSP の URL もカメラ毎の URL を取得できます。
また、複数のカメラがある場合は、それらを1つの画面(ビュー)にまとめることができ、マルチ画面をそのまま RTSP でストリーミングすることも可能です。
カメラの切り替えは管理画面の左側にあるカメラのリストから行います。マルチカメラの画面を見たいときは 「Group View」 を選択します。
2つのカメラからの映像に変わりました。ここでマルチカメラの RTSP URL を確認できます。
コピーした URL は次のようになっています。マルチカメラ用の「カメラ ID」として camera=5
と指定されていることが分かります。
rtsp://192.168.40.135?camera=5&videoframeskipmode=empty&videozprofile=classic&resolution=1920x1080&fps=10×tamp=0&videocodec=h264
この URL を使えば複数カメラの映像を1つにしたビューでストリーミングできました。
RTSP パスワードの扱いについて
今回は RTSP URL へのアクセスにユーザー認証を使いました。この認証のパスワードには特殊記号を使うことできます。
しかし特殊記号が入っていると、利用するクライアントによっては正常に URL を解釈できずストリーミングに失敗することがあります。
対処方法はいくつかあるので次に紹介します。
特殊記号を使ったパスワードの対応方法
- 環境変数を利用する
- URL エンコードして利用する
- 特殊記号を使わない
3 は外して、1と2についてまとめました。
方法 | メリット | デメリット |
---|---|---|
環境変数を利用する | お手軽に試せる |
・VLC media player のようなデスクトップアプリでは使いづらい ・一部のクライアントでは環境変数内の特殊記号を正しく展開できないことがある |
URL エンコードする | すべてのパターンで利用できる | 事前にエンコードする手間が発生する |
環境変数を使う場合
環境変数を使う場合、ffplay や プログラムから利用する場合はお手軽に試すことができるので便利です。
一方で VLC media player などのデスクトップアプリでは使いづらいので、そのような場合はパスワードを URL に含めることになります。
VLC media player で特殊記号の入ったパスワードを URL に含めて試したところ、特殊記号を解釈できなかったようで、パスワードだけ再度入力するウィンドウが開いたので、再度パスワードだけ入力することで映像を確認できました。
URL エンコードする場合
環境変数で渡しても「渡した先のアプリ」で特殊記号を解釈できない場合は、認証に失敗することがあります。
別途記事として紹介する予定ですが、Gstreamer では RTSP パスワードに特殊記号が含まれていると RTSP で接続できません。(環境変数で渡しても認証エラーとなり接続できません)
このような場合は、「パスワードを URL エンコードしたもの」 を認証情報として利用します。
jq
コマンドを使うと簡単にエンコードできます。
jq
はバージョンによってエンコードできない場合があったので、利用する場合は最新のものをインストールしてください
Ubuntu(22.04 LTS) で試したところ、apt-get
や snap
では古いバージョンがインストールされたので、GitHub から最新のものをインストールしました。
先日 1.8.0
がリリースされたようですが、1.7.1
で動作確認しました。
$ jq --version
jq-1.7.1
では、パスワード 3Z%)*eNFxQ!5
で試してみます。
これをエンコードすると 3Z%25%29%2AeNFxQ%215
という結果になりました。
この 3Z%25%29%2AeNFxQ%215
をパスワードとして使うと Gstreamer でも正しく認証処理できるようになりました。
echo '3Z%)*eNFxQ!5' |jq -Rr @uri
3Z%25%29%2AeNFxQ%215
最後に
今回は、Axis のカメラで簡単に RTSP でストリーミングする手順を紹介しました。
公式ドキュメントはあるのですが、ドキュメントに明示されていないことも多く、管理画面をあちこち弄りながら検証してみました。
引き続き MQTT 利用や Amazon Kinesis Video Streams との連携、オリジナルアプリの開発方法などを紹介していきたいと思います。