DebianでEPGStationのCMカット&ロゴ除去エンコード環境ビルド手順

 エンコードAtom系を含む多くのインテル系CPUでハードウェアエンコードが可能なQSVに対応したFFmpegを使うためにLibVA、GmmLib、Intel Media Driver、Intel Media SDK(libmfx)のビルドとインストールを行う。

sudo apt install git make automake libtool cmake g++ pkg-config libdrm-dev -y
git clone https://github.com/intel/libva.git && cd libva && ./autogen.sh && make && sudo make install && cd ..
git clone https://github.com/intel/gmmlib.git && cd gmmlib && mkdir build && cd build && cmake .. && make && sudo make install && cd ../..
git clone https://github.com/intel/media-driver.git && cd media-driver && mkdir build && cd build && cmake .. && make && sudo make install && cd ../..
git clone https://github.com/Intel-Media-SDK/MediaSDK.git && cd MediaSDK && mkdir build && cd build && cmake .. && make && sudo make install && cd ../..
echo '/opt/intel/mediasdk/lib' | sudo tee /etc/ld.so.conf.d/imsdk.conf && sudo ldconfig

 QSVエンコードに使うデバイスファイル(/dev/dri/renderD128)を扱うためにユーザーをrenderグループに所属させる。また、Jasper Lake以降はHuCファームウェアが必要なのでロードする設定を作成して、再起動する。

sudo usermod -aG render $USER
echo 'options i915 enable_guc=2' | sudo tee /etc/modprobe.d/i915.conf

 最終的なCMカットやロゴ除去はAVSファイルで指定するのでAviSynth+が必要になる。また、AVSファイル内でTSファイルを読み込むためにL-SMASH Worksが必要になるので、L-SMASH Worksの前提となるL-SMASHFFmpegが必要になる。さらにL-SMASH Worksを入力としてFFmpegの音声エンコードが失敗するのを避けるためにFDK AACも必要になるので、これらのビルドとインストールを行う。

sudo apt install git autoconf libtool make meson gcc nasm cmake g++ pkg-config libdevil-dev libx264-dev libvpx-dev libvorbis-dev -y
git clone https://github.com/AviSynth/AviSynthPlus.git && cd AviSynthPlus && mkdir build && cd build && cmake .. && make && sudo make install && cd ../..
git clone https://github.com/mstorsjo/fdk-aac.git && cd fdk-aac && ./autogen.sh && ./configure && make && sudo make install && cd ..
git clone https://git.ffmpeg.org/ffmpeg.git && cd ffmpeg && PKG_CONFIG_PATH=/opt/intel/mediasdk/lib/pkgconfig ./configure --enable-gpl --enable-avisynth --enable-libmfx --enable-libx264 --enable-libvpx --enable-libvorbis --enable-libfdk-aac --enable-nonfree && make && sudo make install && cd ..
git clone https://github.com/l-smash/l-smash.git && cd l-smash && ./configure --enable-shared && make && sudo make install && cd ..
git clone https://github.com/HomeOfAviSynthPlusEvolution/L-SMASH-Works.git && cd L-SMASH-Works/AviSynth && LDFLAGS="-Wl,-Bsymbolic" meson build && cd build && ninja && sudo ninja install && cd ../../.. && sudo ldconfig

 最初に必要になるのが、無音部分やシーンチェンジ部分の位置を検出してテキストファイルに出力するchapter_exeで、次に必要になるのが、透過ロゴの位置を検出したテキストファイルと透過ロゴを除去するAVSファイルに出力するlogoframe、これらの出力を統合してCMカット情報のAVSファイルを出力するのがjoin_logo_scpとなる。これに加えてlogoframeで出力した透過ロゴを除去するAVSファイルで使われているAviSynthの透過ロゴ除去プラグインのdelogoも必要になるので、これらのビルドとインストールを行う。

git clone https://github.com/tobitti0/chapter_exe.git && cd chapter_exe/src && make && sudo cp chapter_exe /usr/local/bin/ && cd ../..
git clone https://github.com/tobitti0/logoframe.git && cd logoframe/src && make && sudo cp logoframe /usr/local/bin/ && cd ../..
git clone https://github.com/tobitti0/join_logo_scp.git && cd join_logo_scp/src && make && sudo cp join_logo_scp /usr/local/bin/ && cd .. && sudo cp -r JL /usr/local/etc/ && cd ..
git clone https://github.com/tobitti0/delogo-AviSynthPlus-Linux.git && cd delogo-AviSynthPlus-Linux/src && sed -i -e 's/^LDLAGS = -shared -fPIC/LDLAGS = -shared -fPIC -lstdc++/' Makefile && make && sudo make install && cd ../..

 EPGStationでCMカット&ロゴ除去エンコードを行うためのシェルスクリプトをEPGStationのconfigディレクトリにjlse.shの名前で作成してconfig.ymlに登録する。

cd EPGStation
cat << 'EOT' > config/jlse.sh
#!/bin/sh
tmp=`mktemp -d`
echo "TSFilePath=\"$INPUT\"" > $tmp/input.avs
echo "LWLibavVideoSource(TSFilePath, fpsnum=30000, fpsden=1001)" >> $tmp/input.avs
echo "AudioDub(last, LWLibavAudioSource(TSFilePath, av_sync=true))" >> $tmp/input.avs
timeout -k 60 1800 chapter_exe -v $tmp/input.avs -o $tmp/chapter_exe.txt
if [ $? -ne 0 ]; then cat /dev/null > $tmp/chapter_exe.txt; fi
logo="SID`expr $CHANNELID % 100000`"
ls /usr/local/etc/logo/$logo*.lgd
if [ $? -ne 0 ]; then logo=""; fi
logoframe $tmp/input.avs -logo "/usr/local/etc/logo/$logo*.lgd" -oa $tmp/logoframe.txt -o $tmp/logoframe.avs
case $CHANNELID in
3208043008 | 3272102056 | 400101 | 400103 ) jl="JL_NHK.txt" ;;
3272202064 | 400161 ) jl="JL_MBS.txt" ;;
700333 ) jl="JL_ATX.txt" ;;
* ) jl="JL_標準.txt" ;;
esac
join_logo_scp -inlogo $tmp/logoframe.txt -inscp $tmp/chapter_exe.txt -incmd "/usr/local/etc/JL/$jl" -o $tmp/join_logo_scp.avs
cat $tmp/input.avs $tmp/logoframe.avs $tmp/join_logo_scp.avs > $tmp/input_cut.avs
videoheight=`echo "$VIDEORESOLUTION" | sed -e 's/[^0-9]*\([0-9]*[0-9]\).*/\1/'`
if [ $videoheight -gt 720 ]; then ab="192k"; scale=",scale=-2:720"; else ab="128k"; scale=""; fi
if [ "$AUDIOCOMPONENTTYPE" = "2" ]; then dualmonomode="-dual_mono_mode main"; else dualmonomode=""; fi
$FFMPEG -hwaccel qsv -hwaccel_output_format qsv -y $dualmono -f avisynth -i $tmp/input_cut.avs -movflags faststart -vf yadif$scale -preset 7 -aspect 16:9 -c:v h264_qsv -q:v 23 -f mp4 -c:a libfdk_aac -ar 48000 -ab $ab -ac 2 "$OUTPUT"
if [ $? -ne 0 ]; then rm -f "$OUTPUT"; rm -f "$INPUT.lwi"; rm -rf $tmp; exit 1; fi
rm -f "$INPUT.lwi"
rm -rf $tmp
exit 0
EOT
chmod +x config/jls.sh
sed -i -e "/^encode:/a\    - name: CMCUT\n      cmd: '/bin/sh %ROOT%/config/jlse.sh'\n      suffix: .mp4\n      rate: 4.0" config/config.yml
cd ..
sudo mkdir /usr/local/etc/logo

 上記スクリプトは、/usr/local/etc/logoディレクトリに透過ロゴのlgdファイルを用意しておく必要がある。透過ロゴのlgdファイルはWindows上でAmatsukaze等を使って別途作成したものをlogoディレクトリに予めコピーしておく。尚、lgdファイルが1つも無い状態だとlogoframeが文字化けしたファイルをいくつか作成するので注意。