Linuxで録画鯖を建てる #04「自動エンコードとNASアップロード」
前回までのあらすじ
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に関しては下手に自分で組むよりも,こっちのほうが楽だしなによりも使いやすい.
Synology DiskStation DS218j 2ベイ NAS キット 日本正規代理店アスク サポート対応 デュアルコアCPU搭載 保証2年 CS7088
- 出版社/メーカー: Synology
- 発売日: 2017/10/27
- メディア: Personal Computers
- この商品を含むブログを見る
自動エンコード用のシェルスクリプトを作成
次の機能を盛り込んだシェルスクリプトを作成した.
- 自動エンコード(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移行をします.