RaspberryPIから動画ストリーミング

# 実現したいこと
- RaspberryPIで動画ストリーミング配信
- カメラの候補は、UVC対応カメラが第１候補。(難しければpicameraでも妥協できる)
- クライアントはAndroidスマホ。屋外で使う。

実現したいのは上記ですが付随していろいろ調べたのでそれのメモです。
ほぼ既存情報へのポインタですが参考になる人がいるかもしれないので投稿します。

# 機材(2016/10/10追記)

- [RaspberryPI3 Model B](https://www.amazon.co.jp/Raspberry-Pi-RASPBERRY-model-Element14/dp/B01CCOXV34)
- [CAMERA MODULE V2](https://www.raspberrypi.org/products/camera-module-v2/)
- [RIOCH THETA S](https://theta360.com/ja/about/theta/s.html)


# 結果
最初に結果を。

表1. picamera

| 構成 | RaspPI(host) | 解像度(host)|PC(client) | Android(client)| 遅延 |コメント|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 1  | gst(udp)  | 1280x720 | gst(udp)  | (見つからず)  | 小  |androidアプリが見つからず|
| 2-1  | gst(tcp)  | 320x200  | (試してない) | ※1  | 小  |スマホを縦<->横位置にするとしばらく表示がおかしい|
| 2-2  | gst(tcp)  | 640x480 | (試してない) | ※1  | 超大  |↑同上|
| 3  | WebRTC(uv4l)  | 1920x1080 | chrome  | chrome  | 小 |ホスト側でweb serverを立ち上げる必要あり。クライアント側はブラウザがあれば見れる|

表2. USBCam(RICOH THETA S)

| 構成 | RaspPI(host) | 解像度(host)|PC(client) | Android(client)| 遅延 |
|:-:|:-:|:-:|:-:|:-:|:-:
| 1  | gst(udp)  | 1280x720 | gst(udp)  | (見つからず)   | 小  |
| 2-1  | gst(tcp)  | 320x200  | (試してない) | ※1  | 大  |
| 3  | WebRTC(uv4l)  |  1920x1080 | chrome    | chrome    |  大 |

※1
>
[RaspberryPi Camera Viewer
](https://play.google.com/store/apps/details?id=pl.effisoft.rpicamviewer2)

# RaspberryPI側の準備
- GStreamerのインストール
gstreamerでストリーミング配信する場合に必要(表1の1,2-1,2-2の構成)

`sudo apt-get install gstreamer1.0 gstreamer1.0-tools`
>
[THETA S + Raspberry Pi 2でライブストリーミングしてみた](http://qiita.com/syumai/items/ccf4a0116c3986e90c74)

- WebRTC(uv4l)関連パッケージのインストール
WebRTC(uv4l)でストリーミング配信する場合に必要(表1の3の構成)

>
[Raspberry Pi3とUSB WEBカメラでストリーミング](http://qiita.com/sp_ice/items/7f15e262fffd69d3375c)

# ストリーミング(gstreamer(udp))

1. picamera

下記記事に従って実施
>
[GStreamerでRaspberry Piからストリーミング配信をする](http://qiita.com/locatw/items/084874acdff23a47591c)

`raspivid -n -w 1280 -h 720 -b 4500000 -fps 30 -vf -hf -t 0 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=10 pt=96 ! udpsink host=[配信対象のIPアドレス] port=9000`


2. USB Camera(UVC対応カメラ)

下記記事に従って実施

>
[THETA S + Raspberry Pi 2でライブストリーミングしてみた](http://qiita.com/syumai/items/ccf4a0116c3986e90c74)

所謂WebCamが手元になかったのでUVC対応しているTheta Sで確認

`gst-launch-1.0 v4l2src ! videoconvert ! omxh264enc ! rtph264pay pt=96 config-interval=1 ! udpsink host=[配信対象のIPアドレス] port=9000`

# ストリーミング(gstreamer(tcp))

下記アプリのgoogle playで見れるアプリ説明欄に従って設定

>
[RaspberryPi Camera Viewer
](https://play.google.com/store/apps/details?id=pl.effisoft.rpicamviewer2)

`raspivid -n -w 320 -h 200 -b 2000000 -fps 30 -vf -hf -t 0 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=10 pt=96 ! gdppay ! tcpserversink host=192.168.0.24 port=9000`

# ストリーミング(WebRTC)

下記記事に従って実施

>
[Raspberry Pi3とUSB WEBカメラでストリーミング](http://qiita.com/sp_ice/items/7f15e262fffd69d3375c)

# 観る(client)
1.PCで観る

表1の1のケース。下記リンクを参考。

>
[GStreamerでRaspberry Piからストリーミング配信をする](http://qiita.com/locatw/items/084874acdff23a47591c)

ちなみにWindwos10 Anniversary Updateでは下記リンクからたどれるgstreamerはインストールはできますが（警告あり）、起動できませんでした。

2.Androidで観る
 
表1の2-1,2-2のケース。下記アプリを使用。

>
[RaspberryPi Camera Viewer
](https://play.google.com/store/apps/details?id=pl.effisoft.rpicamviewer2)

3.WebRTC(uv4l)

下記記事に従って実施。P2Pなので複数クライアントは同時接続できない(?)。

>
[Raspberry Pi3とUSB WEBカメラでストリーミング](http://qiita.com/sp_ice/items/7f15e262fffd69d3375c)





# Wifi direct
スマホ<->RaspberryPI直結はWifi Directで実現する。
下記をほぼそのままなぞってできました。
自宅のLANのIPアドレスが192.168.0.* なので
hostapdのアドレスは192.168.1.20 にしました。

>
[Raspberry PiとスマートフォンをWiFiでアドホック接続](http://karaage.hatenadiary.jp/entry/2015/11/04/073000)



# その他
- uv4l関連のパッケージをインストールしたら、USBCamが認識されなくなってしまった。lsusbではリスト表示されるが、/dev/video* にでてこない。uv4lを実行すると、/dev/video2 とかを新規に作るみたい。

# まとめ
試したレベルで理解できていないところが多いので結論がだせないが、
今回の目的に対しては、WebRTC(uv4l)にするのがよさそうである。
ただ,uv4lを使うとUSBCamが認識できなくなって困りそうなのと遅延が大きい。
WebRTCももう少し基礎から理解する必要あり。