Raspberry PiでRTSPネットワークカメラを構築する方法

# 1. はじめに
今回は、自分自身への備忘録を兼ねて、Raspberry PiでRTSPネットワークカメラの構築方法を、お伝えしたいと思います。

参考文献：[【小ネタ】Raspberry Pi と USB接続のWebカメラ でRTSPサーバを作って動画を配信する](https://dev.classmethod.jp/hardware/raspberry-pi-rtsp-server/)

## 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を推奨します。

```plaintext:RASPBIAN_Buster_WITH_DESKTOPダウンロードサイトURL
https://www.raspberrypi.org/downloads/raspbian/
```

参考：この記事作成時のファイルバージョン：2019-09-26-raspbian-buster-full.zip

　

## 2-2. microSDカードのフォーマット
- [SD Formatter for Windows](https://www.sdcard.org/jp/downloads/formatter_4/eula_windows/index.html)などのソフトを用いて、使用するmicroSDカードをフォーマットしておく。

## 2-3. microSDカードへOSイメージの書き込み（所要時間：15分）
- [Etcher](https://www.balena.io/etcher/)などのソフトを用いて、使用するmicroSDカードへOSイメージを書き込む。

## 2-4. Raspberry Pi の有線LAN 固定IPアドレスの設定
- [Visual Studio Code](https://code.visualstudio.com/download)などのテキストエディタを用いて、microSDカード直下フォルダの「cmdline.txt」ファイルを開き、1行目の行末に固定IPアドレスを追記し、保存する。保存の際は、テキストファイルの文字コード、改行コードが変わらないよう注意すること。
![スクリーンショット (9).png](https://qiita-image-store.s3.amazonaws.com/0/240522/a67f68e1-68bd-92b4-4b28-a2acf5269c18.png)

![スクリーンショット (11).png](https://qiita-image-store.s3.amazonaws.com/0/240522/857f7bdd-d5aa-af3e-0dff-4a9cc342375d.png)

```plaintext:cmdline.txt
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は、各自の環境に合わせて設定してください。）

```plaintext:wpa_supplicant.conf
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アドレスに設定します。
<font color="Red">**普段、PCを有線LANでお使いの方は、一時的にオフラインとなります。このあと、Raspberry Pi側で、無線LANネットワークを利用し、オンライン認証が必要となります。必ず、無線LANネットワークが確保できている状況でこれからの作業を進めてください。お持ちのPCに、有線LANポートが付いていない場合は、USB型のイーサネットアダプタ等をご用意ください。**</font>

## 3-1. イーサネットのアダプタオプション変更
- 「Windowsアイコン」→「設定」→「ネットワークとインターネット」→「アダプタのオプションを変更する」を選択する。

![スクリーンショット (13).png](https://qiita-image-store.s3.amazonaws.com/0/240522/77d8639a-c1fa-152f-6b56-8009080a0f2b.png)

　

- ネットワーク接続画面の「イーサネット」を右クリックし、「プロパティ」を選択する。
- イーサネットのプロパティ画面で、「インターネットプロトコルバージョン4（TCP/IPv4）を選択し、「プロパティ」ボタンをクリックする。

![スクリーンショット (14).png](https://qiita-image-store.s3.amazonaws.com/0/240522/52e6cde9-a2b8-79ff-2ea7-091d141919c4.png)

　

- 全般タブ内の「次のIPアドレスを使う」をチェックし、「IPアドレス」および「サブネットマスク」を設定し、「OK」ボタン、「適用」ボタンをクリックする。
![スクリーンショット (15).png](https://qiita-image-store.s3.amazonaws.com/0/240522/b887ceb9-7ab0-fdc9-c08b-e1ba6c408b95.png)

```plaintext:IPアドレス
192.168.1.1
```

```plaintext:サブネットマスク
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コマンドを実行し、ネットワークの疎通確認をする。

```plaintext:pingコマンド（疎通確認PC→RaspberryPi）
C:\> ping 192.168.1.2
```
![cmd.png](https://qiita-image-store.s3.amazonaws.com/0/240522/32290ecb-b006-1513-b84a-50eb20d6a238.png)

　

## 4-3. SSHクライアントでの接続
- PCで、SSHクライアント（TeraTerm 等）を起動し、ホストにRaspberry Piの固定IPアドレス「192.168.1.2」またはホスト名「raspberrypi.local」を入力し、OKボタンをクリックする。
![teraterm1.png](https://qiita-image-store.s3.amazonaws.com/0/240522/abd6bb9c-8e89-515b-3383-066e26a097dc.png)

　

- セキュリティ警告が出た場合は、「続行」ボタンをクリックする。
![teraterm2.png](https://qiita-image-store.s3.amazonaws.com/0/240522/2fe8704a-5280-1588-ce7e-b7de141debc6.png)

　

- SSH認証画面で、ユーザ名とパスフレーズを入力し、「OK」ボタンをクリックする。

```plaintext:ユーザ名（デフォルト）
pi
```

```plaintext:パスフレーズ（デフォルト）
raspberry
```

　

- SSHクライアントで、ログインが確認できたことを確認する。
![teraterm4.png](https://qiita-image-store.s3.amazonaws.com/0/240522/912d8c07-ae58-c84e-8168-04ddf931f84f.png)

　
# 4-4. 環境設定の設定（SSHクライアントでの操作）
- SSHクライアントから、以下の操作をおこない、環境設定「タイムゾーン」と「VNC接続の許可」を設定する。

```plaintext:環境設定
$ sudo raspi-config

4 Localisation Options → I2 Change Timezone → Asia → Tokyo

5 Interfacing Options → P3 VNC → YES → Ok

設定が済んだら、「Finishi」を選択し、環境設定を終了する。
```

![teraterm5.png](https://qiita-image-store.s3.amazonaws.com/0/240522/ccaa6d69-997e-8640-eebd-11dda7897de3.png)

　

![teraterm6.png](https://qiita-image-store.s3.amazonaws.com/0/240522/f54b7e26-a668-c8d2-dd87-a05dfd0d58c7.png)

　

![teraterm7.png](https://qiita-image-store.s3.amazonaws.com/0/240522/fd0b39e5-6404-3a62-0457-391fa6b96d9a.png)

　

![teraterm8.png](https://qiita-image-store.s3.amazonaws.com/0/240522/deeb569c-ef87-5d54-f0c8-17a9fee18937.png)

　

## 4-5. VNCクライアントでの接続
- VNCクライアントを起動し、Raspberry Piの固定IPアドレスまたはホスト名「raspberrypi.local」を入力し、接続する。

```plaintext:RaspberryPiの固定IPアドレス
192.168.1.2
```

![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/240522/93fd8e5b-6de6-a3eb-8fd4-65866b31c27d.png)

　

- VNCクライアントで、Raspberry Piのパスワードを入力し、接続する。

```plaintext:RaspberryPiのパスワード（デフォルト）
raspberry
```
![vnc2.png](https://qiita-image-store.s3.amazonaws.com/0/240522/07c1e74b-35d0-35c6-0db5-3a06abae568e.png)

　

## 4-6. Raspberry Piで無線LAN（Wi-Fi）接続する（VNCクライアントでの操作）
<font color="Red">そろそろ大詰めですが、ここからのコマンド操作では、オンラインでの認証作業が必要となり、Raspberry Piをオンラインに接続する必要があります。手順に従い、Raspberry Piをオンライン状態にしてください。</font>

- VNCクライアントから、ネットワークアイコンをクリックし、各自の無線LANアクセスポイント（Wi-Fi）に接続する。
![キャプチャ6.PNG](https://qiita-image-store.s3.amazonaws.com/0/240522/6bf6303c-3e6d-e451-cbf3-3682bac1de6b.png)

　
- VNCクライアントでの、Raspberry Piで無線LAN（Wi-Fi）接続が完了したら、ネットワークアイコンが、無線LANアイコンに代わることを確認する。
![キャプチャ7.PNG](https://qiita-image-store.s3.amazonaws.com/0/240522/d19133ae-1dbf-e08b-a8df-28fc8bc92203.png)

　

## 4-7. Raspberry Pi のソフトウェアアップデートおよびファームウェアアップデートの実行

```plaintext:アップデートコマンド＆アップグレードコマンド
$ sudo apt update
$ sudo apt upgrade

このコマンドで、「パッケージ一覧の更新」および「パッケージの更新」が完了します。

```

# 5. Raspberry PiへRTSPをセットアップ（SSHクライアントでの操作）
やっとこさ、準備が整いましたね。手順としては、残すところあとわずかです。

## 5-1. SSHクライアントからRaspberry Piへ接続する。
![ssh1.png](https://qiita-image-store.s3.amazonaws.com/0/240522/7134e020-7c1d-7629-7738-0cb6784db285.png)

## 5-2. USBカメラをRaspberry Piに接続する。

## 5-3. USBカメラの認識を確認する。
- /dev/video0が表示されること。

```plaintext:コマンド
$ 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」を末尾に追記すること。

```plaintext:コマンド
$ 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をインストールする。

```plaintext:コマンド
// モジュールのインストール
$ 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ネットワークカメラ映像を配信

```plaintext:コマンド
$ sudo v4l2rtspserver
```

# 7. Windows10のVLCメディアプレイヤーでRTSPネットワークカメラ映像を確認
- メニューから「メディア」 ＞ 「ネットワークストリームを開く」 を選択する。

- 「ネットワークURL」に以下のURLを設定する。
rtsp://raspberrypi.local:8554/unicast
 または固定IP指定
rtsp://192.168.1.2:8554/unicast
 で入力し、「再生」ボタンをクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240522/fb4e0737-d666-f59d-fe37-2ad3b31ccac5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240522/3221961f-4993-cd41-5cd7-1bd8ff008a80.png)

# 8. Raspberry Pi起動時にサービス自動起動するようにする。
- /etc/rc.localファイルに ``` /usr/local/bin/v4l2rtspserver -W 1280 -H 720 -F 3 ``` を追記する。（-Wに横幅、-Hに高さ、-Fにフレーム数を指定する。）
- フレーム数に7～8以上指定すると、比較的カクツキの少ない映像配信ができるかと思います。

```plaintext:コマンド
$ 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ネットワークカメラのサービス自動起動を確認する。

```plaintext:コマンド
// 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をデーモン化してみた](http://raspi.seesaa.net/article/415778601.html)

## 10.1 supervisorのインストール

```plaintext:コマンド
$ sudo apt-get update
$ sudo apt-get install supervisor
```

## 10.2 conf設定ファイルの新規作成

```plaintext:コマンド
$ 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設定ファイルの再読み込み

```plaintext:コマンド
$ sudo supervisorctl reread
v4l2rtspserver: available
```

## 10.4 サブプロセス追加反映

```plaintext:コマンド
$ sudo supervisorctl add v4l2rtspserver
v4l2rtspserver: added process group
```

## 10.5 supervisorステータスの確認
- ステータス状態が「RUNNING」であれば、すでにv4l2rtspserverがデーモン化して起動中となります。ステータス状態が「FATAL」の場合は起動失敗しているので、ログ出力ファイル「/var/log/v4l2rtspserver.log」を確認しましょう。

```plaintext:コマンド
$ sudo supervisorctl status
v4l2rtspserver                   RUNNING   pid 1000, uptime 0:00:01
```