enebular で YouTubeLive 配信の呪文を唱えてみた。

## はじめに

ラズパイカメラを使用して raspivid コマンドと ffmpeg コマンドを組み合わせた <FONT COLOR=#808080><B>呪文</B></FONT> を唱えて YouTubeLive 配信を行ってみた。
![ORG_DSC04855.JPG](https://qiita-image-store.s3.amazonaws.com/0/72479/e7703d68-6501-71c6-8107-b83df4201c3d.jpeg)

## Wi-Fi 接続環境の問題

社外勉強会へ行くと Wi-Fi 接続環境が提供されることがあるが、セキュリティ上の都合で YouTubeLive 配信ができない場合があるので注意が必要。
パターン①は自宅等では一般的で全く問題ないケースだが、社外勉強会や公衆無線 LAN 等ではほとんど見かけない。
<img src="https://qiita-image-store.s3.amazonaws.com/0/72479/9ba5289c-83b8-cd5c-3402-47ef5f44bd77.png" width="75%">
パターン②は社外勉強会や公衆無線 LAN でよく見かけるケース。NDI 等で映像・音声を共有し、OBS 等で Picture in Picture 形式で配信することはできない。
<img src="https://qiita-image-store.s3.amazonaws.com/0/72479/59d4dddf-61b9-280c-d758-a0b6191617d2.png" width="75%">
解決案として、Wireless WAN 機能の付いた Wi-Fi ルーター (<A HREF="https://www.buffalo.jp/product/detail/wmr-433w-wh.html">WMR-433W-WH</A> など) を使用することでパターン①と同じ環境を作ることができる。
<img src="https://qiita-image-store.s3.amazonaws.com/0/72479/120e7828-d94d-204e-4c7e-8a8ba0f0209f.png" width="65%">
パターン③はストリーミングプロトコルで使用するポート番号も制限されているため、配信することはできない。
<img src="https://qiita-image-store.s3.amazonaws.com/0/72479/5b2e95ff-82b4-cc38-8d87-a271bc1e4d8f.png" width="75%">

## ラズパイからの配信環境

Raspberry Pi 3 Model B / B+、Raspberry Pi Zero W は無線 LAN 機能を持っているため Wi-Fi 環境へ接続できる。

<img src="https://qiita-image-store.s3.amazonaws.com/0/72479/7a6a767b-2209-7261-bec6-6469ec44e4d7.png" width="65%">

## ストリームキー

YouTubeLive 配信にはストリームキーが必要になる。ストリームキーを取得するためにチャンネルを有効化する必要があるが、有効になるまで <FONT COLOR=#FF0000><B>24時間</B></FONT> 程度掛かるため注意。(事前に準備しておく必要がある。)

![スクリーンショット 2019-02-02 19.35.20.png](https://qiita-image-store.s3.amazonaws.com/0/72479/d124a2d2-6732-124d-97c7-4c02715f1b34.png)
![スクリーンショット 2019-02-02 19.35.33.png](https://qiita-image-store.s3.amazonaws.com/0/72479/2f0ae7a7-123e-10f6-238a-50373b85c8e0.png)

## 必要な機材

- Raspberry Pi 3 Model B+ (Raspberry Pi 3 Model B、Raspberry Pi Zero W でも可)
- Raspberry Pi カメラモジュール (カメラモジュール V2 でも可)
- HDMI 3.5 インチ LCD ディスプレイモニター (MPI3508 を使用。無くても可。)

## 呪文

raspivid コマンドと ffmpeg コマンドを組み合わせて ラズパイカメラ の映像を YouTubeLive 配信することができる。コマンドの最後にストリームキーを指定する必要がある。ストリームキーを変更すれば異なるチャンネルに配信することが可能。

```bash
$ raspivid -o - -rot 90 -t 0 -vf -hf -fps 25 -b 500000 | ffmpeg -re -ar 44100 -ac 2 -acodec pcm_s16le -f s16le -ac 2 -i /dev/zero -f h264 -i - -vcodec copy 
-acodec aac -ab 128k -g 50 -strict experimental -s 640x320 -f flv rtmp://a.rtmp.youtube.com/live2/[ストリームキー]
```

enebular (Node-RED の exec ノード) から <FONT COLOR=#808080><B>呪文</B></FONT> を唱える場合、"|" (パイプ) が含まれるとエラーになるため、シェルスクリプト化する。(例えば、live.sh という名前で保存する。)

```bash:live.sh
#!/bin/sh
ARG=$1
raspivid -o - -rot 90 -t 0 -vf -hf -fps 25 -b 500000 | ffmpeg -re -ar 44100 -ac 2 -acodec pcm_s16le -f s16le -ac 2 -i /dev/zero -f h264 -i - -vcodec copy 
-acodec aac -ab 128k -g 50 -strict experimental -s 640x320 -f flv rtmp://a.rtmp.youtube.com/live2/$ARG
```

live.sh の後ろにストリームキーを指定してコマンドを実行する。

```bash
$ live.sh [ストリームキー]
```

## enebular から 呪文 を唱える

enebular でフローを作成し、exec ノードから 呪文 (シェルスクリプト) を 唱える (実行する)。inject ノードから配信の開始と終了をすることができる。配信開始の場合は、既に配信している ffmpeg プロセスを終了してから開始するフローにしている。

![スクリーンショット 2019-02-01 23.27.23.png](https://qiita-image-store.s3.amazonaws.com/0/72479/804a1600-3c6d-bc2d-801b-6834ba6d87a2.png)

### exec ノード

配信開始
<img src="https://qiita-image-store.s3.amazonaws.com/0/72479/b568d39b-3cac-0c8a-872a-7536601112b8.png" width="75%">

配信終了
<img src="https://qiita-image-store.s3.amazonaws.com/0/72479/8e3f3b86-df05-d952-94d3-945a8690089e.png" width="75%">

また、ブラウザから特定の URL へアクセスすることで配信の開始と終了をすることもできる。(192.168.13.4 はラズパイの IP アドレス)

![ON.png](https://qiita-image-store.s3.amazonaws.com/0/72479/e3c44ca4-e431-8e3c-86b7-c00ae79f6696.png)
![OFF.png](https://qiita-image-store.s3.amazonaws.com/0/72479/d44959c2-1083-72cf-8b2e-ccde9b63e424.png)

※ ニーズがあるかどうか分かりませんが、enebular でフローを公開しておきます。(´・ω・`)
https://enebular.com/discover/flow/47b455f5-f4c1-4ca4-94af-267ae9b61705

## NDI 送信の呪文

以前記事に書いた「<A HREF="https://qiita.com/kitazaki/items/eeb710a78c657024f844">ラズパイから NDI 送信してみた</A>」も同じように enebular から 呪文 (シェルスクリプト) を唱える (実行する) ことができる。

### NDI 送信環境

Wi-Fi 接続環境パターン①は問題無いが、パターン②では Wireless WAN 機能の付いた Wi-Fi ルーターを使用することでラズパイカメラの映像を PC へ送信することが可能。

<img src="https://qiita-image-store.s3.amazonaws.com/0/72479/5c608e39-e426-a29d-3d29-06896b1962e9.png" width="65%">

### NDI 送信開始フロー

exec ノードから NDI 送信スクリプト (ndi.sh) を実行する。
![スクリーンショット 2019-02-02 11.25.35.png](https://qiita-image-store.s3.amazonaws.com/0/72479/0be2fb64-8ed0-d325-ae06-96f11c3960c1.png)

```bash:ndi.sh
#!/bin/sh
raspivid -o - -rot 90 -t 0 -vf -hf -fps 10 -b 500000 | /home/pi/NDI/ffmpeg/ffmpeg -re -f h264 -i - -vcodec wrapped_avframe -strict experimental -f libndi_newtek -pix_fmt uyvy422 -s 640x360 RPiCamera
```

### OBS で NDI 受信

ラズパイカメラの映像を PC の OBS で受信し、テロップ等を加えて YouTubeLive 配信することができる。

![スクリーンショット 2019-02-02 11.24.27.png](https://qiita-image-store.s3.amazonaws.com/0/72479/c52800df-9077-bc94-715d-9a97a8b1bb5c.png)

## まとめ
enebular AWS IoT agent と enebular editor からラズパイを操作して YouTubeLive 配信をできるようにしてみました。ラズパイへ SSH でログインして 呪文 を唱える必要が無くなりました。
みなさんも 良き enebular ライフを！
![IMG_6712.JPG](https://qiita-image-store.s3.amazonaws.com/0/72479/0cf41088-0018-b2a2-cd65-877d5a2a8b5f.jpeg)