Raspberry Pi3とUSB WEBカメラでストリーミング


# 概要
Raspberry Pi3を購入したので、自宅で留守番するペットの見守り用に、WEBカメラの映像をストリーミングする環境を構築しました。

# UV4L(Userspace Video4Linux framework)とは
Video4Linux2準拠のモジュラーコレクションです。
様々なエクステンションが用意されており、
インストールすることで、ストリーミングが可能となります。

# UV4Lのインストール
piユーザーでの作業を想定しています。

## 1.リポジトリの追加

以下のコマンドを実行します。

```
$ sudo nano /etc/apt/sources.list
```
以下を末尾に追記します。

```
deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main
```

## 2.uv4lのインストール

以下のコマンドを実行します。

```
$ sudo apt-get install uv4l uv4l-webrtc uv4l-uvc uv4l-xscreen uv4l-dummy
```

依存するパッケージがいろいろインストールされたのを確認します。

```
$ dpkg -l | grep uv4l
ii  uv4l                                  1.9.10                                    armhf        User space Video4Linux Framework Core
ii  uv4l-decoder                          1.6                                       armhf        Video Hardware Decoder support for the
ii  uv4l-dummy                            1.0                                       armhf        Dummy driver module for UV4L.
ii  uv4l-encoder                          1.7                                       armhf        Video Hardware Encoder support for the
ii  uv4l-mjpegstream                      1.3-6                                     armhf        MJPEGStream driver module for UV4L.
ii  uv4l-renderer                         1.5                                       armhf        Video Renderer for the WebRTC Extension
ii  uv4l-server                           1.1.58                                    armhf        Streaming Server module for UV4L with HTTP/HTTPS front-end.
ii  uv4l-uvc                              1.5-1                                     armhf        Usb Video Class driver module for UV4L.
ii  uv4l-webrtc                           1.38                                      armhf        WebRTC extension for the
ii  uv4l-xmpp-bridge                      1.8                                       armhf        XMPP Bridge for UV4L
ii  uv4l-xscreen                          1.2                                       armhf        XScreen driver module for UV4L.
```

## 3.USBカメラ接続確認

家に転がっていたUSB WEBカメラ(iBUFFALO BSW20KMD10H)をラズベリーパイに接続します。  
※WEBカメラはUVC(USB Video Class)に対応した機種である必要があります。

```
$ lsusb
Bus 001 Device 004: ID 1dd8:0018  
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

Device004が新たに表示されるようになりました。  
あとで使うので、「1dd8:0018」の部分をメモしておきます。


## 4.uv4lの起動

以下のコマンドを実行します。
--device-pathのところに

```
$ uv4l --driver uvc --device-id 1dd8:0018 --config-file=/etc/uv4l/uv4l-uvc.conf
<notice> [core] Trying driver 'uvc' from built-in drivers...
<warning> [core] Driver 'uvc' not found
<notice> [core] Trying driver 'uvc' from external plug-in's...
<error> [core] No device found at specified path 1dd8:0018
<alert> [core] No device detected
```

## 5.WEBブラウザからアクセス
下記のURLにアクセスすると、WebRTCを使用したストリーミングが可能となります。
「Call」ボタンをクリックすると、WEBカメラの映像が画面に表示されます。

```
http://<ラズベリーパイのIPアドレス>:8090/stream/webrtc
```

![スクリーンショット 2016-04-26 23.37.55.png](https://qiita-image-store.s3.amazonaws.com/0/6811/c940f448-a448-257d-5ffe-a7805c979b01.png)


iOS SafariはWebRTCに未対応のため、下記のURLから映像のみ(mjpeg)が閲覧できます。

```
http://<ラズベリーパイのIPアドレス>:8090/stream
```

## 6.終了する

下記のコマンドで終了できます。

```
$ sudo pkill uv4l
```

## 7.設定ファイルの編集

インストールした時点で自動起動が有効になっているので、デバイスIDを指定しておきます。
次回起動時は、そのままブラウザでストリーミング可能な状態となっています。

```
$ sudo nano /etc/uv4l/uv4l-uvc.conf
device-id = 1dd8:0018
```

外部から自宅ラズベリーパイにアクセスする場合は、下記の設定でBasic認証が有効にしておきましょう。
ID:user
PW:myp4ssw0rd

```
server-option = --user-password=myp4ssw0rd
```

## 8.オーディオの設定

WebRTCのストリーミングにて、音声を有効にするには、以下の設定ファイルを新規作成します。
ラズベリーパイを再起動すると有効になります。

```
$ sudo nano /etc/asound.conf
pcm.!default {
type asym
playback.pcm "plug:hw:0"
capture.pcm "plug:dsnoop:1"
}
```


# まとめ
ラズベリーパイ標準のカメラモジュールを使った情報は多いのですが、WEBカメラでの設定は情報が少なかったので、情報共有します。
カメラモジュールの場合はポート8080が初期値になっていて、uvcでは8090が初期値だと気づくまでに、だいぶ時間がかかりました。。。

# 参考サイト
* http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=14
* http://qiita.com/kgbu/items/ccdc69b5fd66b49f454f
* http://raspberrypi.stackexchange.com/questions/39690/configuring-uv4l-for-webrtc-using-usb-camera-on-rpi2-raspbian
* http://www.slideshare.net/KensakuKOMATSU/webrtc-uv4lwebrtc