RaspberryPiをWebカメラとして使用する

# 経緯

お仕事で、RTSPストリーミング配信をするWebカメラが必用になった時、手元に RaspberryPi（とカメラモジュール） があったので、Webカメラは購入せずに RaspberryPi で代替えしようと検討してみました。
で、結局、H265の配信方法が分からなく、アマゾンセール 5,000円 のWebカメラを買いました。。。  
面倒なことを考えたくない人は、アマゾンセールとかでWebカメラの購入をお勧めします。


# 動画配信の種類と使い方

## ダイレクト UDP ストリーミング

ざっと調べた感じでは、omxplayer 以外ではストリーミング配信を受信できないっぽいです。
なので、ストリーミング配信端末と視聴端末は、どちらもRaspberryPiである必用がありそうです。。。

- ストリーミング配信元 RaspberryPi

    ```bash
    $ raspivid -a 12 -t 0 -w 1920 -h 1080 -hf -ih -fps 30 -o udp://#:5000
    ```

    `#` はストリーミング配信先のIPアドレスです。

- ストリーミング受信側 RaspberryPi

    ```bash
    $ omxplayer --win 0,0,800,480 udp://@:5000
    ```


## ダイレクト TCP ストリーミング

この方法もストリーミングの視聴アプリに制限がありそうです。
VCL では視聴できますが、mplayer での視聴方法が分からなかった。。。

- ストリーミング配信元 RaspberryPi

    ```bash
    $ raspivid -a 12 -t 0 -w 1920 -h 1080 -vf -ih -fps 30 -l -o tcp://0.0.0.0:5000
    ```

- VLC での視聴方法
    `メディア(M) ⇒ ネットワークストリームを開く(N) ⇒ ネットワークURLを入力してください` に下記を入力して `再生` ボタン押下

      ```text
      tcp/h264://#:5000
      ```

## raspivid コマンドお主なオプション

  - -a 12        # annotate
  - -t 0         # timeout disabled (default=5s)
  - -w 1280      # width
  - -h 720       # height
  - -hf          # horizontal flip
  - #-vf         # vertical flip
  - -ih          # insert inline headers to stream
  - -fps 30      # frames per second
  - -o udp://192.168.1.10:5000    # 動画を受信する RaspberryPi のIP:Port


## RTSPストリーミング

## v4l2rtspserver

- インストール

  ```bash
  $ sudo apt-get install cmake
  $ cd ~/
  $ git clone https://github.com/mpromonet/v4l2rtspserver.git
  $ cd v4l2rtspserver
  $ cmake .
  $ make
  $ sudo make install
  ```

- カーネルモジュールのロード

  ```bash
  $ sudo modprobe bcm2835-v4l2
  ```

- ストリーミングサーバ起動

    ```bash
    $ v4l2rtspserver -W 1920 -H 1080 -F 30
    ```

    ストリーミング配信されるビデオフォーマットはH264のようです。
    コンパイルログを見る限りH265にも対応してそうな感じですが、指定方法が分からなかった。。。

## gstreamer

- ライブラリのインストール

    ```bash
    $ sudo apt-get install gstreamer1.0 gstreamer1.0-tools
    $ sudo apt-get install libglib2.0-dev
    $ sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
    ```

- gstreamer server のインストール

    ```bash
    $ cd ~/
    $ wget https://gstreamer.freedesktop.org/src/gst-rtsp-server/gst-rtsp-server-1.10.4.tar.xz
    $ tar -xf gst-rtsp-server-1.10.4.tar.xz 
    $ cd gst-rtsp-server-1.10.4
    $ ./configure
    $ make
    $ sudo make install
    ```

- gstreamer の RaspberryPi カメラモジュールのインストール

    ```bash
    $ cd ~/
    $ git clone https://github.com/thaytan/gst-rpicamsrc.git
    $ cd gst-rpicamsrc/
    $ ./autogen.sh 
    $ make
    $ sudo make install
    ```

- ストリーミングサーバ起動

    ```bsah
    $ ${HOME}/gst-rtsp-server-1.10.4/examples/test-launch --gst-debug=3 "( rpicamsrc bitrate=10000000 awb-mode=tungsten preview=false ! video/x-h264, width=1920, height=1080, framerate=30/1 ! h264parse ! rtph264pay name=pay0 pt=96 )"
  ```

### ストリーミング視聴法

- VLC での視聴方法
  'メディア(M) ⇒ ネットワークストリームを開く(N) ⇒ ネットワークURLを入力してください` に下記を入力して `再生` ボタン押下

      ```text
      rtsp://192.168.179.109:8554/unicast
      ```

- mplayer での視聴方法

  ```bash
  $ mplayer rtsp://192.168.179.109:8554/unicast
  ```

# 参考サイト

- [Raspberry Pi/Camera streaming](https://wiki.marcluerssen.de/index.php?title=Raspberry_Pi/Camera_streaming)
- [試行錯誤な日々: raspiカメラの映像をrtsp形式で配信する方法](https://asukiaaa.blogspot.com/2017/07/raspirtsp.html?m=1)
- [ラズパイ動画ストリーミング](https://non-it-engineer.com/%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4%E3%81%8B%E3%82%89%E3%81%AE%E5%8B%95%E7%94%BB%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E9%85%8D%E4%BF%A1%E3%81%8C)
- [How to make a Raspberry Pi an RTSP streamer and how to consume this?](https://gist.github.com/lemonlatte/799a43288b0e093f9c95ad83ae4962a3)