みかんのゆるふわ技術ブログ

Raspberry PiやIoT関係のことを書き残していきます

Raspberry Pi + JanusでUSBカメラの映像をWebRTCでストリーミング配信

Raspberry Piを監視カメラ的に使う方法の1つとして、JanusというオープンソースのWebRTCサーバーを使って動画を配信する方法があります。

以前の記事ではUbuntuサーバーにJanusをインストールして、ビデオチャットのデモを動作させました。

www.mikan-tech.net

今回はRaspberry PiJanusをインストールしてみます。Raspberry Piで動かすのですし、ビデオチャットよりもWebカメラの映像をストリーミング配信する例を紹介したいと思います。

Janusのインストール

Janusのインストールは、こちらの記事のUbuntuサーバーへのインストール方法と全く同じでできます。

www.mikan-tech.net

唯一違うのは、Raspberry Pi OSにはGitがプリインストールされていないため、事前にGitをインストールしておく必要があることです。

$ sudo apt install git

あとは全く同じ手順でOKです。手順に従い、Nginxと自己署名証明書もインストールしてください。 Ubuntuサーバーと全く同じ手順でインストールできるなんて、Raspberry Piは便利ですね! ただしビルド時間は相当かかりますので、全てインストールし終わるのに30分くらいみておいてください。

f:id:kimura_khs:20200815162428p:plain

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でデモ画面にアクセスし、上のメニューからDemoStreamingを開き、Startボタンを押します。

f:id:kimura_khs:20200815165920p:plain

先ほど設定ファイルを編集して追加したH.264 live stream coming from gstreamerのStreamを選択し、Watch or Listenボタンを押します。 サンプルのまま名前を変えていなかったのでgstreamerのままでした…。

f:id:kimura_khs:20200815165926p:plain

このように、右側でRaspberry PiにつないだWebカメラが撮影している映像が出てきます。 1280x720で撮影していますが、表示上小さくなっています。これは、HTMLファイルを編集してカスタマイズして大きな表示にしたいですね。 とはいえこの状態で、Raspberry PiのLoad Averageは0.3~0.5程度と、まだ余裕があります。ハードウェアエンコーダーのおかげですね。 遅延も正確に測定はしていませんが、1秒以内にはなっているようで、この価格の機器としては優秀です。

おわりに

これを活用すれば、Raspberry PiとWebカメラで監視カメラ的なものがDIYできます。 起動時にJanusが自動で起動するようにしたり、画面をカスタマイズすれば、自分だけの監視カメラが完成です。 セキュリティに気を付ければ、インターネット越しに見られるようにしたり、自由自在です。 このあたりの発展形のDIYについても、後々紹介していきたいと思います。

追記

Vue.jsで独自のフロントエンドを作成する記事を書きました!ぜひご覧ください。

www.mikan-tech.net

www.mikan-tech.net

※こちらのロジクールのカメラはオートフォーカスで画質が良くお気に入りです!