created: 2022-08-28T13:57:29.413Z

EPGStation で mp4 ファイルが生成されないのをとりあえずでなんとかした

前回までのあらすじ。

EPGStation で録画ができるはできるのだが、mp4 ファイルが生成されないことがあったので調べた。

ログを確認

似たような話かなと思ったのでこの issue を見ていた。

エンコード時の logs/Service/system.log のログを再度確認してください。

エンコードがされてるときのログは同じディレクトリの logs/Service/encode.log に吐かれていた。ログの塩梅がちょうどよくて読みやすい。

[2022-08-28T22:43:57.622] [INFO] encode - add new encode: 4
[2022-08-28T22:43:57.685] [INFO] encode - encode start. mode: H.264 name: xxxxx......mp4
[2022-08-28T22:43:57.685] [INFO] encode - encodeId: 4
[2022-08-28T22:43:57.686] [INFO] encode - encodeCmd.suffix: .mp4
[2022-08-28T22:43:57.686] [INFO] encode - queueItem.directory: undefined
[2022-08-28T22:43:57.686] [INFO] encode - outputFilePath: /app/recorded/xxxx.mp4
[2022-08-28T22:43:57.739] [INFO] encode - create new encode process: 1661694237738
[2022-08-28T23:03:57.742] [ERROR] encode - encode process is time out: 4 /app/recorded/xxxx.mp4
[2022-08-28T23:03:57.743] [INFO] encode - cancel encode: 4
[2022-08-28T23:03:57.744] [INFO] encode - kill encode process encodeId: 4, pid: 19009
[2022-08-28T23:04:00.369] [INFO] encode - exit code: 1, signal: null
[2022-08-28T23:04:00.370] [INFO] encode - canceld encode: 4
[2022-08-28T23:04:00.370] [INFO] encode - delete encode output file: /app/recorded/xxxx.mp4

[2022-08-28T23:03:57.742] [ERROR] encode - encode process is time out

とのことなので当該箇所を見てみる。

実装の確認

GitHub で雑に検索したらちょうどそのログを吐いているところが出てきた。

動画ファイルの長さに比して、エンコードに時間がかかりすぎるとタイムアウトしてファイルを消してしまうらしい。RaspberryPIのCPUでエンコードだとそんなことになってしまうようだ。

        // タイムアウト設定
        this.timerId = setTimeout(async () => {
            if (this.encodeOption === null) {
                return;
            }

            this.log.encode.error(`encode process is time out: ${this.encodeOption.encodeId} ${outputFilePath}`);
            await this.cancel();
        }, recorded.duration * (typeof encodeCmd.rate === 'undefined' ? EncoderModel.DEFAULT_TIMEOUT_RATE : encodeCmd.rate));

ドキュメントに設定項目がある(rate)

名前からだとこの値がタイムアウト以外にも使われても文句が言えないが、いちいち調べるのもアレなのでこれをざっくりと 4.0 => 20.0 と変更してみた。すると問題なくエンコードが完了するようになった。なんかデフォルトの設定よりも早くタイムアウトしていたようにも見えるが気にしない。

ハードウェアエンコーダを利用するのはまた今度。

余談 (ps コマンドを入れる)

拝借していた docker コンテナ内に ps コマンドがはいっておらず、これを入れるまでがけっこう面倒だったのでメモしておく。

# sudo が入ってなかったので root でログインする
$ sudo docker compose exec -u root epgstation /bin/bash
# E: Unable to locate package update となるので apt からだと通らない
$ apt install -y procps
# https://askubuntu.com/questions/388541/e-unable-to-locate-package-update-when-i-try-to-update-my-system-why
$ apt-get update
$ apt install procp

docker コンテナ内に root 以外のユーザがいるのが盲点で -u root になかなか気がつけなかった。

SLO サービスレベル目標 ―SLI、SLO、エラーバジェット導入の実践ガイド
[ad] SLO サービスレベル目標 ―SLI、SLO、エラーバジェット導入の実践ガイド
Alex Hidalgo, 山口 能迪 (単行本(ソフトカバー))