epgstation で録画したテレビ番組を自動エンコして、チャプタと字幕を追加した mkv を作成する。

ということで、以前から Amatsukaze を使って自動エンコする快適生活を送っていたのだが、そのためには録画サーバと別にエンコマシンが必要で、録画サーバは FreeBSD マシンで、エンコサーバは Windows 8.1 でした。 定期的にメンテナンスはしていたのですが、Windows マシンはときどき勝手に再起動していたり、アップデートで再起動していたりして、エンコがこけていて録画サーバがあふれてしまいそうになったことが何度もありました。 いいかげんどうにかしないといけないなと思っていたのですが、録画サーバでエンコするのは結構負荷的に厳しいと思っていたのであきらめていたのですが、 ffmpeg で vaapi 経由で QSV が使えることが分かったので、重い腰を上げて対応してみました。

とりあえず、録画+エンコサーバに求めることは、

  1. 自動的に録画をエンコして圧縮する。
  2. CMごとにチャプタを打って、飛ばし見しやすくする。
  3. 字幕をsoftsubで書き込んでおく。 です。本当は現行の仕様のように、ニコニコ実況の弾幕も取り込めればよかったのですが、これは今後の課題かな。

ということで、用意するもの。 linux 版の comskip https://github.com/erikkaashoek/Comskip 字幕の読み出しのためのarib2ass https://github.com/Piro77/arib2ass あとは適当に組み合わせるだけです。

ということで、config/enc.sh をテキトーに書き換えます。

#!/bin/sh TMPFN=$$

arg1=${1} CHP="" ln -s “${INPUT}” ${TMPFN}.ts

eval $FFMPEG -hwaccel vaapi -hwaccel_device /dev/dri/card0 -hwaccel_output_format vaapi -i ${TMPFN}.ts -map 0:v:0 -map 0:a:? -c:v h264_vaapi -f mp4 -vf 'hwupload,deinterlace_vaapi' -qp 27 -c:a ac3 ${TMPFN}.mp4

if [ arg1 != “no_cm” ]; then comskip -q –scf ${TMPFN}.mp4 if [ $? -eq 0 ] ; then CHP="–chapters ${TMPFN}.scf " fi fi

arib2ass –file ${TMPFN}.ts –output ${TMPFN}.ass if [ -e ${TMPFN}.ass ] ; then ASS=" ${TMPFN}.ass " else ASS="" fi mkvmerge -v -o ${TMPFN}.mkv ${CHP} ${TMPFN}.mp4 ${ASS} 1>&2 mv ${TMPFN}.mkv “$OUTPUT” rm ${TMPFN}.*

やっていることはコード見ればそのままでわかると思いますが、いくつか追加説明。 config/serviceLogConfig.json の中で、system の level を debug にすると、logs/Service/system.log に細かいメッセージが出るようになるので、確認と修正がやりやすくなります。 テストを終えて実際の運用に移行したら、そこは戻しておきましょう。 #と書いておかないと忘れますw

config/config.json のところで、no_cm 入れると、cm検出のロジックを飛ばします。NHKみたいにCM入らない番組の処理の負荷を下げられます。

あと、arib2ass が非ascii文字が入ったファイル名でおかしくなるので、そこもちょっと逃げてます。

音声多重放送については -map 0:a:? で複数の音声を取り込むようになっています。

とりあえず、しばらくは現行と並行で運用して、大丈夫そうだったら入れ替えましょう。 これでエンコマシンの電源も24hオンじゃない運用できるようになるな。

追記:2020-09-03 Jail の内側でvaapiを動かすには下の4行が必要でした。

[devfsrules_jail_dri=7] add include $devfsrules_hide_all add include $devfsrules_unhide_basic add include $devfsrules_unhide_login add path 'dri*' unhide add path 'dri/*' unhide add path 'drm*' unhide add path 'drm/*' unhide

タグ: EPGStation FreeBSD Ass字幕 Ffmpeg 動画エンコード 録画サーバ 音声多重