偉大な先人の努力により、Linux でも自動CMカットエンコードが比較的容易にできるようになり、
それを EPGStation に導入している記事を見つけた。
今回は、それを先日の EPGStation v2 でのハードウェアエンコード と連携させた。
Introduction
冒頭で触れたように Linux で自動CMカットエンコードが比較的容易にできるようになり、
それを EPGStation に導入している記事を見つけた。
手元で稼働中の EPGStation でも導入しようとしたところ、ハードウェアエンコード設定と噛み合わない点が見つかった。
なお、前述の通り EPGStation は HEVC 10bit + Opus な mp4 を VAAPI でのハードウェアエンコードで生成する。
CMカット
AviSynth+ を用いて Linux でも動作するようにした join_logo_scp の改造版を用いる。
元記事を参照しながら AviSynth+ とそれに対応した ffmpeg などをビルドして、
必要なものがほぼ全部入りのレポジトリ: JoinLogoScpTrialSetLinux を導入する。
基本的には元記事をトレースすれば環境を作ること自体は手間だが、それほど難しくない。
ロゴファイルが必要な場合は Amatsukaze (Windows) で別途用意する。
運用上の問題点
元記事は、EPGStation 用のエンコードスクリプト例まで載せてくれているので、
ソフトエンコードを利用する場合にはこれをベースに適当に調整すれば問題ない。
一方、私は前述の通り VAAPI/QSV を用いたハードウェアエンコードで HEVC 10bit (+Opus) な mp4 を生成したいのだが、
join_logo_scp_trial に含まれる jlse
コマンドでは、HWエンコードオプションの一部を ffmpeg に渡せない。
ハードウェアエンコード対応
ffmpeg を用いたVAAPI なハードウェアエンコードに必要なオプションのうち以下は、
-i: inputFile
より先に持ってくる必要があるようだ (Global Options?)。
-hwaccel
-hwaccel_output_format
-vaapi_device
ところが jlse
コマンドには -i: inputFile
より前に配置するオプションを指定する術がない。
元レポジトリを fork して、ffmpeg に global options (?) を渡せるようにして公開した。 --> GitHub
使い方
元記事の通りに進めて JoinLogoScpTrialSetLinux (本家) を clone 後に、
modules/join_logo_scp_trial
を私のレポジトリのものに置き換えても良いし、
join_logo_scp_trial
のみ参照先を私のものに変更した JoinLogoScpTrialSetLinux (私家) を直接 clone しても良いかもしれない。
余談
join_logo_scp_trial の作者さんは、録画ファイルの拡張子として *.ts 以外を頑なに認めたくない方のようで、
(EPGStation の issues(?) に拡張子についての議論のログが残っていました)
jlse
のコード内でも入力ファイルの拡張子が .ts 以外だとハネるようになっています。
EPGStation の録画ファイル自体は私も *.ts だったので一向に問題はありません。
一方で、実はこの枠組み自体は対象が *.ts ファイルだけでなく、
既に録画後にエンコード済みの mp4 ファイルも取り扱うことができます。
つまりこの入力ファイル拡張子の制限を外すだけで自動CMカット導入前の録画ファイルも扱うことができるようになります。
CMは視聴者にインパクトを与えて記憶に残すために、
動きや変化が大きく、情報量も多いためエンコード時の圧縮率はあまり高くなく、
例えば対照的によく縮むアニメなどの場合、CMカット無しのエンコード済ファイルに締めるCM部のサイズの割合は、
単純な時間的な割合 ~20% (~6min in 30min) よりもずっと大きいです。
(毎週変わらないことが多いオープニングも、時間割合を考えると非常に容量食いですが。)
エンコード条件が完全に同一ではないので比較はなかなか難しいですが、実例としては、
CMカット無しの録画ファイルを H264/AVC (vaapi) + aac で圧縮した mp4 を、
CMカット有りで H265/HEVC (vaapi) + opus で、品質を同程度を目安に再圧縮すると、
ファイルサイズが 1/3~1/4 程度まで縮みました。
音声にいては、元々容量は全体の 1/10 程度だし、
AAC --> Opus でビットレートも 2/3 程度なので影響は大きくありません。
動画部については、一般に同品質で HEVC は AVC の約半分程度のビットレートと言われますが、
これらを考えると元のファイルに締める CM部の容量が如何に大きかったのかが想像できるでしょう。
というわけで私の join_logo_scp_trial には mp4trialブランチ がありまして、
これを用いると、圧縮済みの録画ファイルも含めて、いろんな録画ファイルを扱うことができるようになります。
主な変更点は以下です。
- 入力ファイル拡張子の制限を撤廃
- 入力ファイル名から放送局名を認識するルールの変更
@放送局名
を追加' '_放送局名
を_放送局名
に変更- 放送局名: 半角英字を全角英字に変更 ('BS' → 'BS')
後半は割とどうでもな変更内容ですが、
入力ファイル拡張子の制限撤廃は割と汎用的なのではないかと思います。
今後
元記事では EPGStation を Ubuntu ベースの自前の Docker コンテナに組み込む形で導入されていたが、
私は今後を考えて、EPGStation 作者の l3tnun氏が公開している
docker-mirakurun-epgstation をベースに修正を加えて運用している。
このレポジトリについても少し整理の上で公開していきたいと考えている。