テレビ録画メディアサーバー構築入門(第4回)

自分でコンパイル

Linuxでの録画動画編集処理バイナリのコンパイルは、Windowsと比べて確かに複雑です。その理由を詳細に見ていきましょう。

1. 依存関係の複雑さ:

  • 複数のバイナリ: AviSynth, chapter_exe, logoframe, join_logo_scp, ffmpeg といった複数のツールをコンパイルする必要があります。

  • ライブラリ依存: 各ツールは、L-SMASH-Worksのようなプラグインや、その他のライブラリに依存しています。これらのライブラリは、互いに依存関係を持つ場合があり、バージョン管理が複雑になります。

  • ディストリビューション依存: Linuxディストリビューション (Ubuntu, Fedora, Debianなど) やバージョンによって、パッケージ管理システム (apt, yum, pacmanなど) やライブラリが異なるため、インストール方法が大きく変わります。

2. インストールの煩雑さ:

  • ソースコードの入手: 各ツールのソースコードを個別に取得する必要があります。

  • 依存ライブラリのインストール: 各ツールに必要なライブラリを、適切なバージョンでインストールする必要があります。これは、パッケージ管理システムの知識やコマンドライン操作の経験が必要になります。

  • コンパイルとリンク: ソースコードをコンパイルし、必要なライブラリとリンクして実行可能ファイルを作成する必要があります。これは、コンパイラやビルドシステムの知識が必要です。

  • 環境変数の設定: コンパイルされたバイナリが正しく動作するように、環境変数を設定する必要があります。

3. デバッグの難しさ:

  • エラーメッセージの解釈: コンパイルや実行時に発生するエラーメッセージは、Linuxの環境やライブラリに依存するため、理解が難しい場合があります。

  • 依存関係の追跡: エラーが発生した場合、どのライブラリが原因なのか、どのバージョンが適切なのかを突き止めるのが困難です。

4. Windowsとの違い:

  • パッケージ管理: Windowsでは、通常、インストーラを使って簡単にソフトウェアをインストールできます。一方、Linuxでは、パッケージ管理システムやソースコードからコンパイルする必要があります。

  • ライブラリ管理: Windowsでは、ライブラリは通常、ソフトウェアにバンドルされています。一方、Linuxでは、ライブラリはシステム全体で共有され、バージョン管理が複雑になります。

5. 例: (実際にやってみる必要ありません)

たとえば、ダウンロードして
git clone --depth 1 --recursive https://github.com/tobitti0/JoinLogoScpTrialSetLinux.git
ソースフォルダに移動して
cd JoinLogoScpTrialSetLinux/modules/chapter_exe/src/
コンパイルしようと
make
しても、
gcc -O3 -I/usr/local/include/avisynth -ffast-math -Wall -Wshadow -Wempty-body -I. -std=gnu99 -fpermissive -fomit-frame-pointer -s -fno-tree-vectorize -c chapter_exe.cpp gcc: fatal error: cannot execute ‘cc1plus’: execvp: No such file or directory compilation terminated. make: *** [Makefile:14: chapter_exe.o] Error 1
というようにエラーがでる。まずは AviSynth+をインストールする必要がある。

インストール

前置きが長くなりましたが、ここから本題です。以下は1行ずつ、エラーが出ないか確認しながら進める必要があります。依存関係により、インストールする順序が重要になる可能性があります。

まずはインストールに必要なパッケージをインストールします。

sudo apt 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 meson npm checkinstall libsoundtouch-dev

追記:
Ubuntuインストール後の早い時点で「自動アプデ」すると、コンパイルのためにここで初めてインストールする開発用「dev」パッケージと、自動アプデ対象の通常版「devなし」パッケージとの間にバージョンの食い違いが生じてエラーになります。エラーを回避するには、まず「devなし」のバージョンを下げて、両方のバージョンをそろえる必要があります。これが、第2回で「自動アップでは後回しにするほうがよい」と書いた理由です。

AviSynth+

AviSynth+は動画編集・加工を行うためのツール。元はWindows用。

cd
git clone https://github.com/AviSynth/AviSynthPlus.git
cd AviSynthPlus
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

言わずと知れた動画編集コマンド。AviSynth+のavsファイルを処理できるようにオプション --enable-avisynth をつけて自力でコンパイルする。

cd
git clone --depth 1 -b n6.1.1 https://github.com/FFmpeg/FFmpeg.git ffmpeg_611
cd ffmpeg_611

sudo apt install libunistring-dev libgnutls28-dev libaom-dev libass-dev libdav1d-dev libfdk-aac-dev libvpl2 libva-dev nasm

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-shared  --enable-avisynth  --enable-vaapi  --enable-libvpx --enable-nonfree --disable-doc  --disable-debug   && make -j"$(nproc)"
sudo cp ffmpeg ffprobe /usr/local/bin/
sudo make install
sudo ldconfig

追記:ERROR: libvpl >= 2.6 not foundとなるなら、sudo apt install libvpl-dev libvpl2 して再度試すか、 --enable-libvplを削除する。
追記2:字幕には--enable-libaribb24 : 第21回参照

何をしているかというと、まずconfigureして、次にmakeして、install でcopyします。最後にldconfig で、今後のmakeで今作ったライブラリを読んでもらえるように、リンクをリフレッシュしている。

configureの引数が大変なことになっているのは、後でいろいろなことができるように、この機会に組み込んでおくためです。たくさん含めると、何かが足りないとエラーが出ます。エラーがでるたびに行った必要な追加を、ひとつにまとめたものが、apt installの行になります。エラーが出て進まないよりは、最小構成でもコンパイルできる方が大事なので、最初は必要なものから、少しずつ、あれこれ試行錯誤で追加していくとよいと思います。

さしあたって本稿の目的で使用するのは、映像の --enable-libx264、音声の --enable-libfdk-aac、そして --enable-avisynth ですが、これだけで試すと、--enable-gpl や --enable-nonfree を追加しろと言われます。前者はオープンソースのライセンスGPLを遵守させるためのオプションで、後者は特許や著作権で保護されている可能性のある、または商用利用の制約があるコードを利用できるようにするためのオプションです。

「面倒なので最終結果、コンパイル済みのバイナリをくれ!」という要求は、ライセンスの観点から非常に危険です。

なぜなら、

  • ライセンス違反の可能性: 配布されたプログラムが、そのライセンス条項に違反している可能性があります。バイナリだけの配布がライセンス違反になるケースが多い。

  • 訴訟リスク: ライセンス違反によって、訴訟のリスクが発生する可能性があります。

  • 倫理的な問題: ライセンスを無視してソフトウェアを使用することは、倫理的に問題があります。

ソフトウェアのビルドと使用は、自分の責任で行う必要があります。コンパイル(ビルド)というプロセスは、ライセンス承諾(最近ではおなじみの「同意」クリック)と同じ儀式的意味をもちます。

大事なことは最初に記すべきなのですが、ここでは個人的趣味もしくは研究教育目的(非商用利用)を前提にしています。

L-SMASH-Works

L-SMASH-Worksは、AviSynth+でmp4を扱う際に必要なライブラリです。

cd
git clone https://github.com/dwbuiten/obuparse.git
cd obuparse
make
sudo make install
cd 
git clone https://github.com/vimeo/l-smash.git
cd l-smash
./configure --enable-shared
make
sudo make install
sudo ldconfig

cd
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
sudo ninja install
sudo ldconfig

(ffmpegを先にインストールしないと最後のninja -v でエラーになる。)

chapter_exe, logoframe, join_logo_scp

ロゴ処理支援ツール。AviSynth+用の指示を生成する。chapter_exeはチャプター生成に使います。logoframeとjoin_logo_scpは局ロゴを元にCMを削除するのに使用します。

cd
git clone --depth 1 --recursive https://github.com/tobitti0/JoinLogoScpTrialSetLinux.git
cd JoinLogoScpTrialSetLinux/modules/chapter_exe/src/

#修正:元のままでもコンパイルは通るが
cp mvec.cpp mvec.cpp.bak
sed -i 's/_mm_load_si128/_mm_loadu_si128/g' mvec.cpp
sed -i 's/(__m128i\*)p1 \+  0/(__m128i*)(p1 + 0)/g' mvec.cpp
sed -i 's/(__m128i\*)p2 \+  0/(__m128i*)(p2 + 0)/g' mvec.cpp
cp Makefile Makefile.bak
sed -i -e 's/^CC = gcc/CC = g++/' -e 's/-std=gnu99/-std=gnu++11/' -e 's/-fno-tree-vectorize//g' -e 's/CFLAGS = -O3/CFLAGS = -O3 -msse2/' Makefile
diff -u Makefile.bak Makefile

make
sudo cp chapter_exe /usr/local/bin/

cd
cd JoinLogoScpTrialSetLinux/modules/logoframe/src/
make
sudo cp logoframe /usr/local/bin/
cd
cd JoinLogoScpTrialSetLinux/modules/join_logo_scp/src/
make
sudo cp join_logo_scp /usr/local/bin/
sudo ldconfig

#以下不要
#cd
#git clone --depth 1 https://github.com/tobitti0/delogo-AviSynthPlus-Linux.git
#cd delogo-AviSynthPlus-Linux/src
#make
#sudo make install
#sudo ldconfig

ここでは、独自の対応として、無限ループ対策として、chapter_exeに「修正」をくわえています。chapter_exeは、動画によっては正常に終了しない不具合がありました。

動画変換テスト

EPGStationで録画したファイルは、デフォルト設定では、`docker-mirakurun-epgstation` コンテナ内の `recorded/` ディレクトリに保存されます。このディレクトリは、`sudo` で展開したため、所有者が `root` で、一般ユーザーは書き込み権限がありません(`root` 以外では書き込み権限が `-` となっています)。

takya@fearow22:~$ ls -l |grep docker
drwxr-xr-x  7 root  root       4096  4月 26 09:37 docker-mirakurun-epgstation

コンパイルしたffmpegを試してみたいので権限を変更する。

takya@fearow22:~$ sudo chown 1000:1000 -R docker-mirakurun-epgstation
takya@fearow22:~$ ls -l |grep docker
drwxr-xr-x  7 takya takya      4096  4月 26 09:37 docker-mirakurun-epgstation

録画先フォルダに移動して

cd docker-mirakurun-epgstation/recorded/

オプション -c:v libx264 -c:a libfdk_aacをつけて エンコード (H.264 コーデックで動画videoを、AAC コーデックで音声audioをエンコード)

ffmpeg -i 番組ファイル.m2ts -c:v libx264 -c:a libfdk_aac output.mp4

開始すると最下部に「s/s dup=23 drop=0 speed=3.53x」のように処理速度speedがしめされる。

たとえば、5分の動画で、もとのm2ts が574MB。圧縮後のoutput.mp4は 147MBと、サイズが約 1/4 になりました。画質も確認しておく。

cvlc output.mp4

謝辞

とにかくコンパイルが通るように試行錯誤するのですが、相性問題と同じで、先人の苦労の結果は非常に貴重な情報となります。参考1 参考2 参考3

オープンソースの世界では、実装から改良、移植まで、基本的には無償で貢献されています。モチベーションは知的好奇心、達成感や他者からの感謝といった名誉に繋がる感情が報酬になっている。だからこそ、貢献者の方々への感謝の気持ちを常に忘れないでいたいと思います。



いいなと思ったら応援しよう!

ピックアップされています

全自動TV録画 視聴環境構築

  • 26本

コメント

コメントするには、 ログイン または 会員登録 をお願いします。
テレビ録画メディアサーバー構築入門(第4回)|takya
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1