背景
最近というほどでもないのですが、新居に引っ越しDTV環境を新たに構築することになりました。今まで利用していたマシンは実家に放置してきて、違う地域の番組や放送していない番組を録画・視聴するためのマシンを新調という感じです。
そうなると完全新規の環境を再構築する必要があるのですが、その際に以前と使うマシンを変更することにしました。理由は色々あるのですが、やはりハードウェア(HW)エンコードの高品質化が進んだことが一番大きな理由です。
Raspberry Piを用いた環境でjoin_logo_scpの環境を作ったのは以前に記事にしましたが、その非力な性能だと実験的な意味合いが強かったのに対して、ある程度の性能のマシンを使えばそれなりの品質で使える実用的な環境が作れるようになったのが大きいです。
以前の運用だと、録画マシンとエンコードマシンを別にして環境を構築していましたが、今回は全てを一つのマシンで賄うことにしました。色々持っているマシンを使って検証した結果十分な速度、性能、それが安価に出せるという判断をしたからです。また、HWエンコードの性能が大きく向上したのはIntel CPUのIce Lakeの世代です。それらがデスクトップ版や省電力マシンに降りてきたのが2年ほど前の話ですが、安価に普及しだしたのがここ1年ぐらいの話。製品の最初というのは安定していないもので、私がAlder Lakeの性能が大きく向上したのを聞きつけて環境を構築したのは良かったのですが、早く行動しすぎて全く安定しておらず、目玉の10bit HEVCエンコードがうまく使えないような状態でした。
引っ越しを機にいい加減安定しているだろうということで、手持ちのマシンのHW性能を評価して大丈夫そうという判断をしたまでは良かったのですが、ソフト側(join_logo_scp)を確認しようと思った段階で以前と変わっている部分が多少あったのでjoin_logo_scpのLinux環境を構築する話を残しておこうと思った次第です。
また、私のサイトではARMでの導入は書きましたが、x86系のアーキテクチャの話はないので、ついでにという感じではあります。前書きが長くなりましたが、以下からが本編です。
各種インストール
とりあえず後の作業で必要になるパッケージを適当にいれます。ffmpegとかで必要なのも入れてしまっているので、必要ない人は適宜外してください。環境はUbuntu 22.04です。
sudo apt-get install build-essential cmake ninja-build libmp3lame-dev libopus-dev libvorbis-dev libvpx-dev libx265-dev libx264-dev libavcodec-dev libavformat-dev libswscale-dev libatomic-ops-dev libdevil-dev automake libtool autoconf nodejs
sudo apt-get install meson npm
また、いろいろビルドしている環境だと以前のパッケージやライブラリが共存してしまいビルドが通らないことがあるので要注意です。私はかなり汚い環境でやったのでとても苦労しました…
AviSynthPlusのインストール
公式ドキュメントを見ながらやります。バージョンは3.7.3です。
git clone https://github.com/AviSynth/AviSynthPlus.git
cd AviSynthPlus && mkdir avisynth-build && cd avisynth-build
cmake ../ -G Ninja
sudo checkinstall --pkgname=avisynth --pkgversion="$(grep -r Version avs_core/avisynth.pc | cut -f2 -d " ")-$(date --rfc-3339=date |sed 's/-//g')-git" --backup=no --deldoc=yes --delspec=yes --deldesc=yes --strip=yes --stripso=yes --addso=yes --fstrans=no --default ninja install
ffmpeg
ffmpegをインストールします。これをする理由ですが、後でインストールするL-SMASH-Worksのバージョン指定があるため、バージョンを合わせておかないと後のビルドで躓きます。aptだとAviSynthのオプションが使えないとか以前はあった(今は知りません)というのもあります。
私がこの記事を書いている時点だと、ffmpegの最新リリースがn7.0.2ですが、このバージョンだと使えません。6系の中なら大丈夫そうですが、ひとまずn6.1.1ならいけたので、これに合わせておくとよいでしょう。ひとまずレポジトリは以下のコマンドで用意します。バージョンがわかるようにffmpeg_611というディレクトリに保存しています。
git clone --depth 1 -b n6.1.1 https://github.com/FFmpeg/FFmpeg.git ffmpeg_611
ffmpegのビルドは公式を見たほうがいいと思うので詳細は割愛します。公式ドキュメントを見て必要なパッケージをインストールして、ビルドしてください。参考までに私が./configureをした際の設定を掲載しておきます。
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/build/ffmpeg_build/lib/pkgconfig" ./configure \
--prefix="/usr/local" \
--pkg-config-flags="--static" \
--extra-cflags="-I$HOME/build/ffmpeg_build/include" \
--extra-ldflags="-L$HOME/build/ffmpeg_build/lib:/usr/lib/x86_64-linux-gnu" \
--extra-libs="-lpthread -lm" \
--ld="g++" \
--bindir="$HOME/bin" \
--enable-gpl \
--enable-version3 \
--enable-gnutls \
--enable-libaom \
--enable-libass \
--enable-libfdk-aac \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libdav1d \
--enable-libvorbis \
--enable-libvpl \
--enable-libx264 \
--enable-libx265 \
--enable-shared \
--enable-avisynth \
--enable-vaapi \
--enable-libvpx \
--disable-doc \
--disable-debug \
--enable-nonfree && \
PATH="$HOME/bin:$PATH" make -j"$(nproc)"
sudo make install
この中で公式ドキュメントを見てする際の私的な躓きポイントを紹介しておくと、以下のオプションや設定です。
--prefix="/usr/local"
--enable-shared
--enable-avisynth
--prefixの項目はインストール先を指定する引数です(参考:公式Doc)。これをパスが通っていないところにすると後々面倒なので、取りあえずはパスが通っているところに指定しておくのが無難です。また、ライブラリ関係のパスも通っている場所が良いです。
--enable-sharedはビルドをするページには載っていませんが、今回の場合は必ず必要です。そもそも忘れていた時点で後で躓くのですが、それ以外にもlibavcodec.soを使うソフトがあります。このlibavcodecが曲者で、もともとは一つしかなかったライブラリですが、10年程度にlibavとffmpegで別れて開発が進んだ過去があります(分裂の過去)。Intel系のドライバでlibav側の方が必要になるタイミングがあるのですが、これが原因で何が悪いか気づくのに苦労しました。
--enable-avisynthはffmpegのビルドに気を取られていると、後でビルドできないで躓くだけです。ffmpegのビルドについて調べてもavisynthを有効にしてやる人はほぼいないので、大体後になって忘れます。
最後にffmpegのバージョン情報だけ残しておきます。
ffmpeg version n6.1.1 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 11 (Ubuntu 11.4.0-1ubuntu1~22.04)
configuration: --prefix=/usr/local --pkg-config-flags=--static --extra-cflags=-I/build/ffmpeg_build/include --extra-ldflags='-L/home/build/ffmpeg_build/lib:/usr/lib/x86_64-linux-gnu' --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/bin --enable-gpl --enable-version3 --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libdav1d --enable-libvorbis --enable-libvpl --enable-libx264 --enable-libx265 --enable-shared --enable-avisynth --disable-doc --disable-debug --enable-nonfree
libavutil 58. 29.100 / 58. 29.100
libavcodec 60. 31.102 / 60. 31.102
libavformat 60. 16.100 / 60. 16.100
libavdevice 60. 3.100 / 60. 3.100
libavfilter 9. 12.100 / 9. 12.100
libswscale 7. 5.100 / 7. 5.100
libswresample 4. 12.100 / 4. 12.100
libpostproc 57. 3.100 / 57. 3.100
l-smash
l-smashのインストールをします。以前は公式のレポジトリを使っていたのですが、後でインストールするL-SMASH-Worksを変更する都合上、違うレポジトリを使います。元レポジトリでも使えるのかもしれませんが、一応推奨しているl-smashを使います。その兼ね合いで追加で「obuparse」なるものもインストールが必要です。l-smashのバージョン2.18.0です。
##obuparseのインストール
git clone https://github.com/dwbuiten/obuparse.git
cd obuparse
make
sudo make install
##l-smashのインストール
git clone https://github.com/vimeo/l-smash.git
cd l-smash
./configure --enable-shared
make
sudo make install
sudo ldconfig
L-SMASH-Works
以前はHolyWuさんという方のforkを利用していたのですが、削除されてしまっており、使えない状態になっていました。なので、今回は別の方のforkから拝借します。また、こちらのIssueによると特定バージョン以外エラーが出るとのこと。今回の場合だと1117.0.0.0なら動くとの情報なのでこれを使わせていただきます。
git clone --depth 1 -b 1170.0.0.0 https://github.com/HomeOfAviSynthPlusEvolution/L-SMASH-Works.git
cd L-SMASH-Works/AviSynth
LDFLAGS="-Wl,-Bsymbolic" meson build
cd build
ninja -v
ninja install
sudo ldconfig
delogo for AviSynth+
delogoをインストールします。説明を読む限りは任意だとおもいますが、とりあえず入れておきましょう。
git clone --depth 1 https://github.com/tobitti0/delogo-AviSynthPlus-Linux.git
cd delogo-AviSynthPlus-Linux/src
make
make install
sudo ldconfig
JoinLogoScpTrialSetLinux
join_logo_scpを使うためのツール一式をインストールします。
git clone --depth 1 --recursive https://github.com/tobitti0/JoinLogoScpTrialSetLinux.git
cd JoinLogoScpTrialSetLinux/modules/chapter_exe/src/
make
cp -a chapter_exe ../../join_logo_scp_trial/bin/.
cd ../../logoframe/src/
make
cp -a logoframe ../../join_logo_scp_trial/bin/.
cd ../../join_logo_scp/src/
make
cp -a join_logo_scp ../../join_logo_scp_trial/bin/.
cd ../../join_logo_scp_trial
npm install
npm link
Raspberry Pi OSでは問題なかったのですが、Ubuntu Server 24.04の環境では‘uint32_t’ does not name a typeというエラーが出てきてchapter_exeのmakeが通らなかったので、以下のように追記しました。
nano chapter_exe/src/compat.h
最初の
#ifndef __COMPAT__
#define __COMPAT__
#ifndef _WIN32
の後に
#include <cstdint>
の一行を追加
これでエラーは解決できます。
一応これで使える環境がインストールできたはずなので、動作確認をします。
jlse -i "入力TSファイル"
トラブルなく解析が走り、問題なくavsファイルが生成されていれば大丈夫です。インストール作業完了ですね。しかし、エラーが出たらその都度解消するしかありません。
私の場合は、l-smashのライブラリでエラーが出ました。エラーの内容的にlibavcodec.so.58が見つからないというエラーで止まっていました。この手の話では珍しく実際にファイルが存在していなかったパターンだったので、とりあえずこのファイルを用意することにしました。前の段階でlibavcodecで面倒な思いをしたのにここでも再び同じ原因のエラーで笑えてきました。
libavcodec.so.58は言ってしまえばlibavcodecのバージョン58系のファイルということなのですが、aptでも入れようと思えば入れられます。ですが、依存パッケージにIntel系のドライバなどが入っており、迂闊に入れると共存して面倒な気配がしたので、対応する古いバージョンのffmpegをビルドしてインストール→新しいffmpegを再度インストールして古いライブラリを用意することにしました。
libavcodecのバージョンだけ調べられるのかと思ったら公式のダウンロードページに各種バージョンが書いてあったので、対応していて一番新しいn4.4.5のバージョンを選んでビルド。必要なパッケージは入れてあるので./configureしてmakeするだけなので少し時間が必要なだけでした。
これをしたら問題なく動作させることができました。
後はffmpegでどんなオプションにするか考えるだけです。こういうのは情報があれば早いですが、なければ時間かかるんですよね。長かった…
以上です。お読みいただきありがとうございました。