Raspberry Pi　ビデオカメラ化

#動画コンテンツ撮影システムを作る
　Raspberry Pi4Bの8Gバイト・メモリを活かして動画撮影システムを作る．Youtuber化してｶﾞｯﾎﾟﾘ

要求仕様
・動画はメインメモリ（RAMディスク）に保存
・撮影中に映像をモニタできる
・ハンドリングしやすいハードウェア（カメラやマイクを別途設置したくない）
・2時間くらい連続撮影
・ネット動画に耐える画質
・複数カメラ対応（スイッチャー欲すぃ）

使うもの
　ハードウェア
　　・Raspberry Pi4B
　　・Pi Camera
　　・USBカメラ（オプション）
　　・PC（オプション）
　　・Jetson Nano（オプション）
　　・Androidスマホ（オプション）
　ソフトウェア
　　・Raspberry Pi OS
　　・motion<Linux>
　　・IP Webcam<Android>


　Linuxでよく使われている動画撮影ソフトウェアとしてmotionがある．映像に変化があったときのみ録画する機能があるため，ペットの監視や，セキュリティ・カメラ用としてよく使われるようである．
　今回，動き検出は必要ないが，ネット上にも比較的情報が多く，手軽に使えそうなのでmotionを使う．

##RAMDISKの設定
　sdカードに書き込みたくないので4Gバイト分RAMDISKを設定する．
　まずマウントポイントとして,`/var/video`を作っておく．

```
mkdir /var/video
chmod 777 /var/video
```

　`/etc/fstab`に以下を追加してリブートする．

```/etc/fstab
tmpfs /var/video tmpfs nodev,nosuid, size=4000M 0 0
```

　再起動後，dfするとRAMDISKとして/var/videoの追加を確認できる．
　後程，/var/videoフォルダに動画ファイルを保存するようにmotionで設定する．

```bash
pi@raspberrypi:/etc/motion $ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root       30359292 3107964  25967240  11% /
devtmpfs         3874072       0   3874072   0% /dev
tmpfs            4006168  535268   3470900  14% /dev/shm
tmpfs            4006168    8684   3997484   1% /run
tmpfs               5120       4      5116   1% /run/lock
tmpfs            4006168       0   4006168   0% /sys/fs/cgroup
tmpfs            4096000  176456   3919544   5% /var/video
/dev/mmcblk0p1    258095   54605    203491  22% /boot
tmpfs             801232       0    801232   0% /run/user/1000
```

##motionの特徴
###ウェブサーバ機能付き
　動画撮影の際，どのように映っているか確認したいので，モニタする機能が必要である．motionはウェブサーバ機能を持っており，Port:8081（デフォルト）で撮影状況をモニタできる．ネットワーク越しにも見られるので便利かも．
###複数カメラ対応
　ネットワーク越しのカメラも使えるので，他ラズパイやスマホのカメラも利用できる．撮影時に1カメ，2カメを設置してみる．親機を映像のスイッチャーっぽく使えるので便利．
　公式ページによると，映像ソースとして以下の物に対応する．
・ネットワークカメラ（RTSP，RTMP，HTTP）
・PI cameras
・V4L2
・ビデオキャプチャカード（コンポジットなど）
・動画ファイル

#環境構築
##motionインストール
　`apt-get install motion`

##motion起動
　sudo motion -n
　/var/log/motionがroot所有になっているため，sudoが必要．
　変更するなら以下．

```
chown pi /var/log/motion
chown pi /var/log/motion/motion.log
```

##motionの設定
　設定ファイルはここ~~/usr/local/etc/motion/motion.conf~~
　・全体設定　/etc/motion/motion.conf
　・カメラごとの設定ファイルを入れるフォルダ　`/etc/motion`（default設定．全体設定のファイルでこのフォルダも指定できる）

　デフォルト設定では，ブラウザでlocalhost:8080にアクセスするとGUIで設定できる．設定内容は，上記の設定ファイルに反映される模様．

　執筆時点で，ラズパイでaptするとmotionのversion 4.0が入る．少し古いようで，現行のversion4.3系とは設定項目に違いがある模様．

##他のラズパイのmotion動画を取り込む（2カメ）
 1. 他のラズパイ（2カメ）にmotionをaptインストール
 1. 2カメの設定ファイルで`stream_localhost off`を設定（ネットワークに公開される）
 1. 親ラズパイ（1カメ）の設定ファイルで1カメ，2カメの設定ファイルを指定
 1. 1カメ設定ファイルを作る（/etc/motion/camera1.conf）
 1. 2カメ設定ファイルを作る（/etc/motion/camera2.conf）
 1. localhost:8080にアクセスするとスイッチャーみたいになっている

以下，1カメ（USBカメラ）の設定ファイルの抜粋．

```camera1.conf
camera_id = 1
videodevice /dev/video0  #ローカルのUSBカメラ
stream_port 8081  #この動画へアクセスできるURLのポート番号設定
width 960
height 720
rotate 180
framerate 30
```

以下，2カメ（USBカメラ，1カメから見るとネットワーク・カメラ）の設定ファイルの抜粋．

```camera2.conf
camera_id = 2
netcam_url http://192.168.137.55:8081  #ネットワーク・カメラ（2カメ）
stream_port 8082  #この動画へアクセスできるURLのポート番号設定
```

##Androidデバイスのカメラを使う（3カメ）
　PlayストアからIP Webcamをインストールしてアプリを起動．
　ウェブ・ブラウザで3カメAndroidデバイスの8080ポートにアクセスすると，細かい設定が可能

```camera3.conf
camera_id = 3
netcam_url http://192.168.138.1:8080
stream_port 8083
```

##設定ファイル・レファレンス
###emulate_motion 
型: Boolean
値: on， off
デフォルト値: off
　映像に動きがなくても，常時録画する

###movie_max_time 
型: Integer
値: 0 (infinite) - 2147483647
Default: 120
　動画の最大長さを秒で指定．0の場合，サイズに制限なし. 

###auto_brightness 
型: Integer
値: 0 - 3
Default: 0 
　明るさの自動調整の設定．動画ではお勧めらしい．自動の中でも1～3で設定できる．3が最も明るめになる．
　上記は公式ドキュメントの説明である（Ver4.3向け）．ラズパイでaptしたmotionの設定ファイルには，値はonかoffで指定することになっている（Ver4.1）．onにしてみたけど，変な動作だったのでOffで使うことにする．どうもデバイスによって，うまく作用しないようである．
　Ver4.3系では次の数字で指定する．
1: brightnessで調整する (onかyesの指定と同じ)
2: exposureで調整する
3: exposure absoluteで調整する

###brightness
型： Integer
値：0-255
　バージョン4.2以降は廃止されている模様．

###stream_localhost 
型: Boolean
値: on, off
Default: on
　localhost以外のホストから動画への接続を拒否する（defualtはonなので拒否）．

###flip_axis
型:　特定文字
値:　none, v, h
Default: none (映像に変化なし)

　指定した軸で画像を反転．記録される画像や動画にも影響する．鏡像の場合に使用する（例えば車のバック・カメラ）．この機能を使うとCPU負荷は増加する． 

###movie_max_time
型: Integer
値: 0 (infinite) - 2147483647
Default: 120
　動画の最大長さ（秒）．0なら無制限．

###movie_bps
型: Integer
値: 0 - 9999999
Default: 400000
　ffmpegで作られる動画のビットレート．単位はbps．
　大きな数値は画質は良いがファイルが大きくなる．
　movie_qualityが0(disabled)のとき，このパラメータが有効になる．

###movie_quality
型: Integer
値: 0 - 100
Default: 60
　ffmpegを呼び出す際に渡すオプションを制御するパラメータと思われる．0以外を指定すると可変ビットレートを有効にする． 
1～100の数値で動画の品質を設定．1は最も低品質，100が最高品質．
ファイル・サイズと動画品質を天秤にかけて，この数値を調整せよ．
　このパラメータを0以外に設定すると，movie_bpsの設定は無視される．

###ffmpeg_variable_bitrate
型: Integer
値: 0, 2 - 31
Default: 0 (disabled)
　ffmpegへ与えるパラメータを制御する．
0以外に設定すると，ffmpeg_bpsの設定が無視される．
　Varsion4.2以降は廃止されている．

###target_dir
型: String
値: Max 4095 characters
Default: Not defined = current directory
　画像や動画を保存するディレクトリのフルパス．
　デフォルトはカレントディレクトリ．
　通常は，絶対パスで指定する．ファイル名の指定で相対パスでディレクトリを指定できるため，このパラメータに/を指定しておくことも可能だが，推奨されない．可能な限り深い階層のディレクトリの指定を推奨する．

###stream_maxrate 

型: Integer
値: 1 - 100
Default: 1

　ストリーミングでのフレームレートの制限．100にすると無制限になる．1人で使う場合や，領域を区切られたLANでない限り大きな数値にし過ぎないこと． 


引用文献
Motion Basic Setup.
https://motion-project.github.io/motion_config.html#top