Raspberry Pi で 校内放送受信端末をつくる

新型コロナの対応で始業式・終業式など、カメラで中継してHR教室で見させるという形になっています。
教室はいろんな設備が整いつつありますが、
職員室にいるスタッフが休憩室のテレビでゆったりみられるようにしたいなと思って、やってみました。

# 環境
- LAN内にnginx-rtmpでたてた中継サーバがあり、HLSで動画を配信します。（この構築の仕方は他の情報で…）
- Raspberry Pi 3 model B

#OS
RaspberryPi OS Lite を Raspberry Pi Imager でインストール
（frame bufferに直接出力するので、GUI環境は不要です）
参考:https://qiita.com/HeRo/items/c1c30d7267faeb304538


#必要なパッケージのインストール
動画再生用に omxplayer
~~配信してない間に静止画を表示するのに fim~~ うまく表示されないTVがあったので修正(10/1)
配信してない間に静止画を表示するのに ffplay

を使います。

```
$ sudo apt update
$ sudo apt upgrade

$ sudo apt install omxplayer ffmpeg -y
```

#再生用のスクリプトをホームディレクトリにつくる
```
$ nano /home/pi/kiosk.sh
```


``` /home/pi/kiosk.sh
#!/bin/bash

target_url="http://***.***.***.***/live/index.m3u8"

message=`curl -m 2 -o /dev/null -s -w %{http_code} $target_url`
ps_play=`ps aux | grep omxplayer.bin | grep -v grep | wc -l`
ps_stop=`ps aux | grep ffplay | grep -v grep | wc -l`

if [ "$message" == "200" ]; then
    if [ $ps_stop -ne 0 ]; then
        killall ffplay
    fi
    if [ $ps_play -eq 0 ]; then
        omxplayer -o hdmi --display 0 $target_url &
    fi
else
    if [ $ps_stop -eq 0 ]; then
       ffplay -fs -loglevel quiet -i /home/pi/screen.png &
    fi
    if [ $ps_play -ne 0 ]; then
        killall omxplayer.bin
    fi
fi

```

target_urlには nginx-rtmp で生成されるHLSのindexファイルを指定する。
↓デバッグ用にアップルのサンプル動画も使えます。
（解像度が低いので、本番運用のチェックにはあまり使えない）
http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8

スクリプトに実行権限を与える

```
$ chmod +x /home/pi/kiosk.sh
```

#配信していないときの画像をホームディレクトリに
上の例では **screen.png** として画像を指定している。
確認

```
$ ls /home/pi/
kiosk.sh  screen.png
$
```

#crontab で定期的にスクリプト実行

```
$ crontab -e 

no crontab for ****** - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /bin/ed

Choose 1-4 [1]: 1
```


一番下の行に
「*/1 * * * * /home/pi/kiosk.sh」を追加

```
～前半省略～
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

*/1 * * * * /home/pi/kiosk.sh
```
*/1 は１分間隔という意味

これで、LAN内に端末をつないで、配信が開始されて１分ほどしたら自動的に再生が開始されるはず…！

# 固定IPで運用する場合
学校内で使うときに、DHCPがあるところと、固定IPで指定するところがあるので

```
$ sudo nano /etc/dhcpd.conf
```

DHCPがなかったらfall backして固定IPになるように、dhcpd.confの下のほうを編集

``` /etc/dhcpcd.conf
～前半省略～
# Example static IP configuration:
#interface eth0
#static ip_address=192.168.0.10/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
#static routers=192.168.0.1
#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1

# It is possible to fall back to a static IP if DHCP fails:
# define static profile
profile static_eth0
static ip_address=192.168.***.***/24
static routers=192.168.***.***
static domain_name_servers=192.168.***.***

# fallback to static profile on eth0
interface eth0
```
# 補足
 **OBS** or **ATEM Mini Pro** --rtmp--> **nginx-rtmp** --HLSに変換--> **Client**(iPadのSafari等)
という流れで配信しています。
フルHD1920x1080 30fps の設定でなんとか移りました。（60fpsは映像がずれるとかコマ落ちするなどなど）
Raspberry Pi 2 model Bでも試しましたが、 raspi-config で オーバークロック設定したらいけました。

# 参考
https://qiita.com/HeRo/items/c1c30d7267faeb304538