Raspberry Piを監視カメラ的に使う方法の1つとして、JanusというオープンソースのWebRTCサーバーを使って動画を配信する方法があります。
以前の記事ではUbuntuサーバーにJanusをインストールして、ビデオチャットのデモを動作させました。
今回はRaspberry PiにJanusをインストールしてみます。Raspberry Piで動かすのですし、ビデオチャットよりもWebカメラの映像をストリーミング配信する例を紹介したいと思います。
Janusのインストール
Janusのインストールは、こちらの記事のUbuntuサーバーへのインストール方法と全く同じでできます。
唯一違うのは、Raspberry Pi OSにはGitがプリインストールされていないため、事前にGitをインストールしておく必要があることです。
$ sudo apt install git
あとは全く同じ手順でOKです。手順に従い、Nginxと自己署名証明書もインストールしてください。 Ubuntuサーバーと全く同じ手順でインストールできるなんて、Raspberry Piは便利ですね! ただしビルド時間は相当かかりますので、全てインストールし終わるのに30分くらいみておいてください。
https://raspberrypi.local/
で、こちらのデモ画面が出てくればOKです。
以下、リンク先の記事と同じく、Janusを/opt/janus
にインストールしたものとします。
USB Webカメラのストリーミング配信
JanusはWebRTCの通信自体を担当する「コア」部分と、ビデオチャットやエコーバックテストなど各種アプリケーションを実現する「プラグイン」で構成されています。付属のプラグインにストリーミング配信機能があります。こちらを使うと簡単に動画配信できます。
Janusのストリーミングプラグイン設定
ストリーミング配信プラグインの設定ファイルは/opt/janus/etc/janus/janus.plugin.streaming.jcfg
です。
中身をみると、初期状態では、3つのサンプルが有効になっています。
rtp-sample
: VP8/OpusのライブストリームをRTPで受けてWebRTCで配信するサンプルfile-live-sample
: ローカルのオーディオファイルを複数のユーザーに同時配信するサンプル(ユーザー間で再生位置が同期)file-ondemand-sample
: ローカルのオーディオファイルを複数のユーザーにオンデマンドで配信するサンプル(ユーザーが好きな位置を再生できるので、ユーザー間で再生位置が異なる)
たとえばRaspberry PiでWebカメラの映像を配信しようと思えば、rtp-sample
を使えばできます。
しかし、これはVP8/Opusでエンコードする必要があります。Raspberry Piには少し荷が重い作業です。
一方、初期状態ではコメントアウトされていますが、H.264もサポートされています。 Raspberry PiはH.264ハードウェアエンコーダーが搭載されているので、これを使えばCPUの負荷低く動画配信ができそうです。 これを使いましょう。
次の部分のコメントアウトを外して、有効にします。
h264-sample: { type = "rtp" id = 10 description = "H.264 live stream coming from gstreamer" audio = false video = true videoport = 8004 videopt = 126 videortpmap = "H264/90000" videofmtp = "profile-level-id=42e01f;packetization-mode=1" secret = "adminpwd" }
デフォルトでは、8004番ポートでRTPの映像を受けるようになっています。音声は無効になっています。
配信用ffmpegのインストール
Webカメラの映像をハードウェアH.264エンコードしながらRTP配信するには、GStreamerかFFmpegが使えます。 個人的にFFmpegは使ったことがあるので、こちらを使ってみます。FFmpegはaptで簡単にインストールできます。
$ sudo apt install ffmpeg
Raspberry Pi OSで配布されているffmpegは、Raspberry PiのH.264ハードウェアエンコーダーが利用できるようになっています。
動かしてみよう
Janusの起動
Janusを起動します。
$ sudo /opt/janus/bin/janus
FFmpegで配信開始
別のコンソールを立ち上げるなどして、FFmpegで動画を配信します。
Webカメラが1台だけの場合、たいていは/dev/video0
で認識されていると思います。
その場合、次のようになります。
$ ffmpeg \ -f v4l2 -thread_queue_size 8192 -input_format yuyv422 \ -video_size 1280x720 -framerate 10 -i /dev/video0 \ -c:v h264_omx -profile:v baseline -b:v 1M -bf 0 \ -flags:v +global_header -bsf:v "dump_extra=freq=keyframe" \ -max_delay 0 -an -bufsize 1M -vsync 1 -g 10 \ -f rtp rtp://127.0.0.1:8004/
-c:v h264_omx
で、Raspberry Piのハードウェアエンコーダーを使ってH.264エンコードを行うことを指定しています。
あとは-video_size
で映像のサイズ(Webカメラの仕様を見て対応しているものを選択)、-framerate
でフレームレート、-b:v 1M
でビットレート1Mbpsなどを指定しています。また出力先を、自分自身(127.0.0.1)の8004番ポートにRTPで出力するように指定しています。
ここは、Janusの設定ファイルの指定に合わせましょう。
コマンドを実行すると、動画配信が始まります。Ctrl-Cで終了できます。
配信動画を見てみよう
配信が始まりましたので、別のマシンから見てみましょう。ここから先はRaspberry Piではなく、パソコンやスマホなどで操作します。
ブラウザーでhttps://raspberrypi.local
でデモ画面にアクセスし、上のメニューからDemo→Streamingを開き、Startボタンを押します。
先ほど設定ファイルを編集して追加したH.264 live stream coming from gstreamerのStreamを選択し、Watch or Listenボタンを押します。 サンプルのまま名前を変えていなかったのでgstreamerのままでした…。
このように、右側でRaspberry PiにつないだWebカメラが撮影している映像が出てきます。 1280x720で撮影していますが、表示上小さくなっています。これは、HTMLファイルを編集してカスタマイズして大きな表示にしたいですね。 とはいえこの状態で、Raspberry PiのLoad Averageは0.3~0.5程度と、まだ余裕があります。ハードウェアエンコーダーのおかげですね。 遅延も正確に測定はしていませんが、1秒以内にはなっているようで、この価格の機器としては優秀です。
おわりに
これを活用すれば、Raspberry PiとWebカメラで監視カメラ的なものがDIYできます。 起動時にJanusが自動で起動するようにしたり、画面をカスタマイズすれば、自分だけの監視カメラが完成です。 セキュリティに気を付ければ、インターネット越しに見られるようにしたり、自由自在です。 このあたりの発展形のDIYについても、後々紹介していきたいと思います。
追記
Vue.jsで独自のフロントエンドを作成する記事を書きました!ぜひご覧ください。
※こちらのロジクールのカメラはオートフォーカスで画質が良くお気に入りです!