ゎぃゎぃのおもちゃ箱

一般的な社会人の遊び場所

Linuxで録画鯖を建てる #04「自動エンコードとNASアップロード」

f:id:yy_kuso:20190630052757p:plain

前回までのあらすじ

OSを入れるところから,Chinachuで録画予約するところまで完了
yy-kuso.hatenablog.com

ffmpegのビルド

これまでビデオはx264,オーディオはLAMEエンコードしたいので対応したffmpegを準備する.

といってもとりあえず,ここにあるシェルスクリプトを拝借して実行しただけ.
www.jifu-labo.net

これで

/usr/local/ffmpeg_build/bin/ffmpeg

ffmpegがビルドされる.

自動エンコードNASアップロード

録画が終了次第,自動でエンコードをしてくれる設定にしたい.
ついでにエンコードした録画データをNASにアップロードしておけば,外部での視聴などに便利.

NASのマウント

まずは起動時にNASをマウントするように設定する.

# file path is /etc/fstab
# 中略
//(NASのIP)/(NASのディレクトリ)  /mnt/(マウント場所)   cifs username=(NASユーザーネーム),password=(NASパスワード),file_mode=0755,dir_mode=0755,iocharset=utf8,uid=1000,gid=1000,forceuid,forcegid,_netdev 0 0

ディレクトリ/mnt/waiwai-nas/videoを作成してマウント場所とした.
ちなみにNASはsysnologyのds218jを使っている.NASに関しては下手に自分で組むよりも,こっちのほうが楽だしなによりも使いやすい.

自動エンコード用のシェルスクリプトを作成

次の機能を盛り込んだシェルスクリプトを作成した.

  • 自動エンコード(m2ts -> mp4, ffpreset利用)
  • 多重ffmpeg起動の回避
  • エンコード後のファイル名のリネーム(全角 -> 半角)
  • 録画m2tsファイルの移動(tempディレクトリへ)
  • drop数を追記
  • mp4ファイルのNASへのアップロード
  • ログファイル書き出し(最新のみ残す)

ファイルを作成する.

# su chinachu
$ mkdir /home/chinachu/chunachu/encode
$ cd /home/chinachu/chinachu/encode
$ vim encode.sh
$ vim h264enc.ffpreset


変数を書き換えることで,違う環境にも対応できるようにしてある.
うちの環境では動くけど,結構付け焼刃的な実装になっているので,適宜書き換えてください.
肝としては,ffmpeg 引数 > /dev/null 2>&1としているところ.これをしないと端末で直接シェルスクリプトを実行したときはちゃんとエンコードできるのに,chinachuから呼び出したときは途中で止まるという問題が発生する.
昔,ニコニコ生放送エンコード用に調整したffpresetをそのまま流用.
アニメ用とかではないので改善の余地がありそう.

tsselectの改造とビルド

上のスクリプト

drop=`$tsselect "$1" | sed 's/,//g' | awk '{sum+=$5} END {print sum}'`
mvname=${mvdirts}/"${title_zen}"_drop${drop}.m2ts

として,drop数を合計し録画ファイルの最後に記載するようにしている.

drop数が多くて出力の"="と数字の間にスペースがないとき,うまく挙動しなくなる.
正規表現とかよくわからないので,それ用にtsselectをプチ改造して使う.

# cd ~/source
# git clone https://github.com/shesee/tsselect-linux.git
# cd tsselect-linux/src
# vim tsselect.c
437行目あたり printf("pid=0x%04x, total= %8ld, d= %3ld, e= %3ld, scrambling= %ld, offset= %ld\n", i, stat[i].total, stat[i].drop, stat[i].error, stat[i].scrambling, stat[i].first);
↑スペース追加
313行目あたり // fprintf(stderr, "\rprocessing: %2d.%02d%%", n/100, n%100);
↑コメントアウト(ffmpegといっしょでこれがあると厄介)
# make
# make install

chianchuにスクリプトの設定

# vim /home/chinachu/chinachu/config.json
        "recordedCommand": "/home/chinachu/chinachu/encode/encode.sh",

encode.shに実行権限を与えるのも忘れないこと.

録画ファイルの自動削除設定

一定期間過ぎた録画ファイルは自動で削除する設定にしておくと,ディスク容量不足で録画できないということを防げる.

# crontab -e
        30 21 * * * find /recorder/temp_ts -mtime 7 -exec rm -f {} \;
# systemctl restart crond

これだと,毎日21:30に実行,temp_tsディレクトリの中で最終更新が7日前(1周間前)のファイルを削除という意味.

次回

録画鯖の運用状況の報告とSSD移行をします.