Raspberry Pi 4BとPlex Media Serverでホームビデオのストリーミング環境を作る

# はじめに

子供の動画を撮ってパソコンに取り込んだまま眠っている動画、ありませんか？
毎度毎度パソコンに取り込み編集して、`BD-R`や`DVD-R`に焼くのも地味に手間が掛かるし・・・。
そこで、ハンディカムで撮影したホームビデオ(4K動画)を気軽にストリーミング再生する環境を作ってみました。

# 環境構築

## `Raspberry Pi 4B`と`Plex Media Server`のセットアップ

基本的なセットアップは以下の記事を参考にしました。

**`Raspberry pi` で `Plex Media Server` を構築する方法**
<https://qiita.com/zono_0/items/208d4cdbd115f109e7f5>

## `Samba`サーバのセットアップ

動画ファイルをバックアップしているPCが`Windows`であるため、`Samba`サーバをセットアップします。
以下を参考にしました。

**リモートワークで使える`Raspberry Pi`で作るファイル共有サーバ**
<https://qiita.com/Brutus/items/d3b3caee982852587b77>

## `ffmpeg`のインストール

扱うのが4K動画であるため、もしかしたら解像度を落とす必要があるかもしれません。
そのため、予め`ffmpeg`をインストールしておきます。

```bash
$ sudo apt-get install ffmpeg
```

## スマホからメディアサーバへの接続

以下のアプリをダウンロードして、**サインイン・サブスクリプション契約(月額520円)**することでメディアサーバへの接続が可能になります。
外出先からメディアサーバへアクセスしたい方やタブレットでメディアサーバへアクセスしたい方は設定しておくと良いでしょう。

<https://play.google.com/store/apps/details?id=com.plexapp.android>

**※サブスクリプション契約無しだとアプリからメディアサーバが表示されませんでした**

## `Fire TV Stick`からメディアサーバへの接続

以下の記事を参考に、`Fire TV Stick`からメディアサーバへの接続も可能となります。
これでリビングからストリーミング再生できる様になりました。

**Fire TV Plexアプリのインストールと使用**
<https://dementium2.com/page-10/fire-tv-plex-2/>

# 動作確認

`Plex`のアカウントを作成していれば、以下のURLで動作確認が行なえます。
※IPアドレス・ポート直打ちでもいいですが、`Chrome`で`保護されていない通信`と表示されてしまいます
<https://app.plex.tv/desktop#>

## HDの動画を再生する

HDの動画再生は特に問題なくスムーズに再生されました。

## 4Kの動画を再生する

普段撮影に使っているハンディカムでは4K画質で撮影を行っているため、これがそのまま見られるなら嬉しかったのですが・・・。
カクつくし、やはり表示・動作が遅いです。
また、**`Raspberry Pi 4B`のCPU使用率が100%**に張り付きました。

## FullHDの動画を再生する

4K動画の画質を落としてFullHDにしてみたらどうかということで、FullHDに変換して再生してみました。

### `ffmpeg`で4K動画をFullHD動画に変換する

以下のコマンド1行で変換できるようです。
`scale=-1:1080`を指定することで`垂直解像度`をFullHDと同じ`1080`にしています。
`アスペクト比`は`16:9`なので、垂直解像度だけ気にしていれば良い感じです。

```bash:サンプル(4K→FullHD)
$ ffmpeg -i <4K動画のファイル名> -vf scale=-1:1080 <FullHD動画のファイル名>
```

ちなみにHDの場合は`scale=-1:720`を指定します。

```bash:サンプル(4K→HD)
$ ffmpeg -i <4K動画のファイル名> -vf scale=-1:720 <HD動画のファイル名>
```

試しに、以下の4K動画を変換してみます。
**※変換にかかる時間を計測するために前後に`date`コマンドを追加しています**

```bash:実際に変換したときのコマンド
$ ls -lh 2019-10-05/2019-10-05_095831.mp4
-rwxr-xr-x 1 plex plex 719M 10月  5  2019 2019-10-05/2019-10-05_095831.mp4

$ date && sudo ffmpeg -i 2019-10-05/2019-10-05_095831.mp4 -vf scale=-1:1080 2019-10-05/2019-10-05_095831_FHD.mp4 && date
2020年 12月 12日 土曜日 10:44:09 JST
<snip>
2020年 12月 12日 土曜日 10:58:07 JST

$ ls -lh 2019-10-05/2019-10-05_095831_FHD.mp4
-rw-r-xr-x 1 plex plex  91M 12月 12 10:58 2019-10-05/2019-10-05_095831_FHD.mp4
```

**719MB**の4K動画が**14分**で**91MB**のFullHD動画になりました。
低消費電力・低コストがウリの`Raspberry Pi 4B`のCPU性能にそこまで期待してませんでしたが、意外と早いかもしれません。
`Samba`経由でアップロードした4K動画を夜間に変換したりするなら十分な処理速度だと思いました。

### 実際にFullHD動画を再生してみる

変換後のFullHD動画を再生してみましたが、特に問題なく再生することができました。
`Raspberry Pi 4B`の`Plex Media Server`では性能的にも**FullHDぐらいがちょうどいい**のかもしれませんね。
※複数の機器から同時アクセスするとサーバ側の負荷が上がるので、利用シーンに応じて動画のサイズを調整するのが良いです

# 途中で気付いた課題とその解決方法

## 一定時間で動画ファイルが自動分割される

動作確認をしていた動画は撮影時間が短かったため気付かなかったのですが、最近撮影した息子のお遊戯会の動画は`20分`ほどで、動画ファイルがいくつかに分割されていました。

**／(^o^)＼ﾅﾝﾃｺｯﾀｲ**

## 解決方法

`ffmpeg`で動画の結合もできるとのことで、以下の通り結合します。

```bash:concat.txt(※ファイル名は任意)
file '2020-12-12_095435.mp4'
file '2020-12-12_100353.mp4'
file '2020-12-12_101311.mp4'
```

```bash:結合コマンド
# 作業ディレクトリへ移動する
$ cd /var/lib/plexmediaserver/Library/HomeVideo/2020-12-12/

# 動画ファイルを結合する
$ ffmpeg -f concat -i concat.txt -c copy 2020-12-12_095435_concat.mp4
```

## `ffmpeg`で動画ファイルを結合する際の注意

`concat.txt`内にファイルパスが記載されていると以下のエラーとなります。

```bash:Unsafeと言われるconcat.txtの書き方
file '/var/lib/plexmediaserver/Library/HomeVideo/2020-12-12/2020-12-12_095435.mp4'
file '/var/lib/plexmediaserver/Library/HomeVideo/2020-12-12/2020-12-12_100353.mp4'
file '/var/lib/plexmediaserver/Library/HomeVideo/2020-12-12/2020-12-12_101311.mp4'
```

```bash:エラーメッセージ
$ ffmpeg -f concat -i concat.txt -c copy 2020-12-12_095435_FHD_concat.mp4
<snip>
[concat @ 0x20211c0] Unsafe file name '/var/lib/plexmediaserver/Library/HomeVideo/2019-10-05/2019-10-05_115434_FHD.mp4'
concat.txt: Operation not permitted
```

`-safe 0`オプションを付けるよう促している記事もありますが、用途に応じて以下2パターンで運用するのが良さそうです。
`Unsafe`なオプションで回避するよりは結合対象ファイルのあるディレクトリに移動するのが正攻法っぽいですね。

* `concat.txt`でパス情報を渡さない場合
    * **ファイル名のみ記載**した`concat.txt`を作る
    * 結合対象ファイルが置いてあるディレクトリに移動する
    * 結合コマンドを実行する
* `concat.txt`でパス情報を渡す場合
    * **結合対象ファイルのフルパスを記載**した`concat.txt`を作る
    * `-safe 0`オプションを付けてて結合コマンドを実行する

# おわりに

一旦ここまででホームビデオのストリーミング環境が構築できました。
また、分割されてしまった長時間の動画も結合により閲覧しやすくなりました。

現状以下の課題があるため、今後改善していこうと思います。

* 今回作った環境は`32GB`の**MicroSDカードのみ**の環境であるため、今後は`外付けHDD`なり`NAS`経由での閲覧などストレージ周りを増強する必要がある
    * 取り急ぎ必要なのは`外付けHDD`で、今後のことを考えると`NAS`を買っても良さそう
* `Samba`サーバへ動画ファイルをアップロードした後、FullHDへ変換・結合をする処理を自動化したい
    * できれば人が触らない夜間に自動で実行できると嬉しい
    * `bash`スクリプト書くのが手軽ではあるものの、`ffmpeg-python`の利用も考慮しておく
* `Raspberry Pi 4B`のケースに付いているファンが思ったよりうるさい
    * 以下のケースを使用したところ、デスクの上に置いていると思いの外ファンがうるさい
        * [最新 Raspberry Pi 4 ケース, 超薄型アルミニウム合金ケース+ヒートシンク+ 35x35x10 冷却大超静音ファン Raspberry Pi4 Model B 8gb /4gb / 2gb / 1gb (ラズベリーパイ4モデルB) 対応 (ラズパイ4本体含みません）](https://www.amazon.co.jp/dp/B087D4MYRB/ref=cm_sw_r_tw_dp_OyV1FbQ60BXYY)
    * 記事の清書中、`強い風モード(5V)`から`静音モード(3.3V)`に切り替えたら少し静かになった