1. はじめに
今回は、自分自身への備忘録を兼ねて、Raspberry PiでRTSPネットワークカメラの構築方法を、お伝えしたいと思います。
参考文献:【小ネタ】Raspberry Pi と USB接続のWebカメラ でRTSPサーバを作って動画を配信する
1-1. この記事を読んでできること
- Raspberry Piを用いた、RTSPネットワークカメラの構築ができるようになる。
2. Raspberry Pi 用の microSDカード作成
ここでは、Raspberry Pi の microSDカードを作成します。今回は、PC と Raspberry Pi を直接、有線LAN接続し、セットアップをすすめますので、そのための事前準備もおこないます。
2-1. OSイメージファイル(RASPBIAN Buster WITH DESKTOP)の入手
- 以下のURLから、OSイメージファイル(RASPBIAN Buster WITH DESKTOP)をダウンロードする。OSイメージファイルは、NOOBSでもよいらしいが、少しセットアップがややこしくなるらしいので、ここでは、Raspbianを推奨します。
https://www.raspberrypi.org/downloads/raspbian/
参考:この記事作成時のファイルバージョン:2019-09-26-raspbian-buster-full.zip
2-2. microSDカードのフォーマット
- SD Formatter for Windowsなどのソフトを用いて、使用するmicroSDカードをフォーマットしておく。
2-3. microSDカードへOSイメージの書き込み(所要時間:15分)
- Etcherなどのソフトを用いて、使用するmicroSDカードへOSイメージを書き込む。
2-4. Raspberry Pi の有線LAN 固定IPアドレスの設定
- Visual Studio Codeなどのテキストエディタを用いて、microSDカード直下フォルダの「cmdline.txt」ファイルを開き、1行目の行末に固定IPアドレスを追記し、保存する。保存の際は、テキストファイルの文字コード、改行コードが変わらないよう注意すること。
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=49783f5b-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh splash plymouth.ignore-serial-consoles ip=192.168.1.2
2-5. Raspberry Pi のSSH有効化の設定
- microSDカード直下フォルダにファイル名「ssh」(空ファイル拡張子なし)で新規作成する。保存の際は、不要なファイル拡張子(.txt等)が付かないよう注意すること。
2-6. Raspberry Pi のWi-Fi設定
- あらかじめWi-Fi設定を済ませておきたい場合に設定してください。
- 設定に自信がない方は、このあとの手順で、Raspberry Pi の GUIからでも設定できます。
- microSDカード直下フォルダにファイル名「wpa_supplicant.conf」(改行コード:LF)で新規作成し、ファイルの内容を以下のとおり設定する。(ssidとパスワードpskは、各自の環境に合わせて設定してください。)
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="----Your-WiFi-SSID----"
psk="----PLAIN-PASSPHRASE----"
}
2-7. microSDカード の完成
- 完成した microSDカード を、PCからおもむろに抜き取る。
3. PCの有線LAN 固定IPアドレス設定
ここでは、PC側(Windwos / Mac)の有線LAN IPアドレスを、固定IPアドレスに設定します。
普段、PCを有線LANでお使いの方は、一時的にオフラインとなります。このあと、Raspberry Pi側で、無線LANネットワークを利用し、オンライン認証が必要となります。必ず、無線LANネットワークが確保できている状況でこれからの作業を進めてください。お持ちのPCに、有線LANポートが付いていない場合は、USB型のイーサネットアダプタ等をご用意ください。
3-1. イーサネットのアダプタオプション変更
- 「Windowsアイコン」→「設定」→「ネットワークとインターネット」→「アダプタのオプションを変更する」を選択する。
- ネットワーク接続画面の「イーサネット」を右クリックし、「プロパティ」を選択する。
- イーサネットのプロパティ画面で、「インターネットプロトコルバージョン4(TCP/IPv4)を選択し、「プロパティ」ボタンをクリックする。
192.168.1.1
255.255.255.0
- これで、PCの固定IPアドレス(192.168.1.1)と、Raspberry Piの固定IPアドレス(192.168.1.2)の設定が完了し、有線LANケーブルを用いて接続できる準備がととのいました。今回の方法を用いることで、通常、Raspberry Piのセットアップで必要となる、USBキーボード、USBマウス、HDMIケーブル、モニタ等を用意せずともRaspberry Piのセットアップを進めることができます。Alexa Voice Service(AVS)のセットアップに限らず、今回の方法を活用してみてください。
4. PC(Windows / Mac)からRaspberry PiへSSH&VNC接続
ここでは、Raspberry Piへ遠隔操作(SSH&VNC接続)するため、PC(Windows / Mac)とRaspberry Piの接続(有線LAN接続)をおこないます。
4-1. Raspberry Piの起動
- Raspberry Piの必須デバイス(USBカメラ)を接続する。
- Raspberry Piの電源をONにし、Raspberry Piにたましいを吹き込む。
4-2. PC と Raspberry Pi との有線LAN接続
- Raspberry Pi の有線LANポートにLANケーブルをぶっさす。
- 片方のLANケーブルを、PCの有線LANポートにぶっさす。
- PCで、ターミナル端末を起動(Windowsの場合は、Win旗印をクリックし、「cmd」を入力後、コマンドプロンプトをクリックすると真っ黒画面が起動する。)
- ターミナル端末から、pingコマンドを実行し、ネットワークの疎通確認をする。
C:\> ping 192.168.1.2
4-3. SSHクライアントでの接続
- PCで、SSHクライアント(TeraTerm 等)を起動し、ホストにRaspberry Piの固定IPアドレス「192.168.1.2」またはホスト名「raspberrypi.local」を入力し、OKボタンをクリックする。
- SSH認証画面で、ユーザ名とパスフレーズを入力し、「OK」ボタンをクリックする。
pi
raspberry
4-4. 環境設定の設定(SSHクライアントでの操作)
- SSHクライアントから、以下の操作をおこない、環境設定「タイムゾーン」と「VNC接続の許可」を設定する。
$ sudo raspi-config
4 Localisation Options → I2 Change Timezone → Asia → Tokyo
5 Interfacing Options → P3 VNC → YES → Ok
設定が済んだら、「Finishi」を選択し、環境設定を終了する。
4-5. VNCクライアントでの接続
- VNCクライアントを起動し、Raspberry Piの固定IPアドレスまたはホスト名「raspberrypi.local」を入力し、接続する。
192.168.1.2
- VNCクライアントで、Raspberry Piのパスワードを入力し、接続する。
raspberry
4-6. Raspberry Piで無線LAN(Wi-Fi)接続する(VNCクライアントでの操作)
そろそろ大詰めですが、ここからのコマンド操作では、オンラインでの認証作業が必要となり、Raspberry Piをオンラインに接続する必要があります。手順に従い、Raspberry Piをオンライン状態にしてください。
- VNCクライアントでの、Raspberry Piで無線LAN(Wi-Fi)接続が完了したら、ネットワークアイコンが、無線LANアイコンに代わることを確認する。
4-7. Raspberry Pi のソフトウェアアップデートおよびファームウェアアップデートの実行
$ sudo apt update
$ sudo apt upgrade
このコマンドで、「パッケージ一覧の更新」および「パッケージの更新」が完了します。
5. Raspberry PiへRTSPをセットアップ(SSHクライアントでの操作)
やっとこさ、準備が整いましたね。手順としては、残すところあとわずかです。
5-1. SSHクライアントからRaspberry Piへ接続する。
5-2. USBカメラをRaspberry Piに接続する。
5-3. USBカメラの認識を確認する。
- /dev/video0が表示されること。
$ v4l2-ctl --list-devices
cm2835-codec-decode (platform:bcm2835-codec):
/dev/video10
/dev/video11
/dev/video12
UVC Camera (046d:080a) (usb-3f980000.usb-1.2):
/dev/video0
/dev/video1
5-4. /etc/modulesにbcm2835-v4l2を追加する。
- 「bcm2835-v4l2」を末尾に追記すること。
$ sudo vi /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
i2c-dev
bcm2835-v4l2
5-5. v4l2rtspserverをインストールする。
// モジュールのインストール
$ sudo apt-get install cmake
$ sudo apt-get install subversion
$ sudo apt-get install liblivemedia-dev
// 任意の作業ディレクトリに移動
$ cd ~/Documents/
// コンパイル&インストール
$ git clone https://github.com/mpromonet/h264_v4l2_rtspserver.git
$ cd h264_v4l2_rtspserver
$ sudo cmake .
$ sudo make install
// インストール後の確認
$ ls -la /usr/local/bin/v4l2rtspserver
6. Raspberry PiからRTSPネットワークカメラ映像を配信
$ sudo v4l2rtspserver
7. Windows10のVLCメディアプレイヤーでRTSPネットワークカメラ映像を確認
メニューから「メディア」 > 「ネットワークストリームを開く」 を選択する。
「ネットワークURL」に以下のURLを設定する。
rtsp://raspberrypi.local:8554/unicast
または固定IP指定
rtsp://192.168.1.2:8554/unicast
で入力し、「再生」ボタンをクリックする。
8. Raspberry Pi起動時にサービス自動起動するようにする。
- /etc/rc.localファイルに
/usr/local/bin/v4l2rtspserver -W 1280 -H 720 -F 3
を追記する。(-Wに横幅、-Hに高さ、-Fにフレーム数を指定する。) - フレーム数に7~8以上指定すると、比較的カクツキの少ない映像配信ができるかと思います。
$ sudo vi /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
/usr/local/bin/v4l2rtspserver -W 1280 -H 720 -F 3
exit 0
8. Raspberry Piを再起動して、RTSPネットワークカメラのサービス自動起動を確認する。
// Raspberry Piを起動
$ sudo shutdown -r now
9. おわりに
みなさまの学習の参考になれば幸いです。
2019/10/26 TAKAHIRO NISHIZONO
10. 追記その1:supervisorを用いたデーモン化
- /etc/rc.localに追記したサービス自動起動の場合、v4l2rtspserverがダウンした時のリスタートやログ出力が管理できていないので、supervisorを用いたデーモン化をしてみました。
- 事前準備として、/etc/rc.localファイルに追記した1行を削除またはコメントアウトし、rasberry pi を一度再起動しておいてください。(v4l2rtspserverのプロセスが停止しており、ポート番号8554が空いている状態にするため)
参考文献:Raspberry Piに【Supervisor】をインストールして、motionをデーモン化してみた
10.1 supervisorのインストール
$ sudo apt-get update
$ sudo apt-get install supervisor
10.2 conf設定ファイルの新規作成
$ sudo vi /etc/supervisor/conf.d/v4l2rtspserver_sv.conf
// 以下の内容を新規ファイルに追記し保存する。
[program:v4l2rtspserver]
command=/usr/local/bin/v4l2rtspserver -W 1280 -H 720 -F 3 ; 起動コマンド
user=pi ; 起動ユーザー
autostart = true ; 自動起動
autorestart = true ; 自動リスタート
numprocs=1 ; 起動するプロセス数
redirect_stderr=true ; エラー出力を標準出力にリダイレクト
stdout_logfile=/var/log/v4l2rtspserver.log ; 標準出力ログのファイル名
10.3 conf設定ファイルの再読み込み
$ sudo supervisorctl reread
v4l2rtspserver: available
10.4 サブプロセス追加反映
$ sudo supervisorctl add v4l2rtspserver
v4l2rtspserver: added process group
10.5 supervisorステータスの確認
- ステータス状態が「RUNNING」であれば、すでにv4l2rtspserverがデーモン化して起動中となります。ステータス状態が「FATAL」の場合は起動失敗しているので、ログ出力ファイル「/var/log/v4l2rtspserver.log」を確認しましょう。
$ sudo supervisorctl status
v4l2rtspserver RUNNING pid 1000, uptime 0:00:01