chinachuを使って録画後に、自動でエンコードまでやってくれるスクリプトの紹介です。
NVENCで紹介しますが、ffmpegのパラメータ書き換えれば他のエンコーダでも当然ながら動作可能ですので、録画後の処理のシェルスクリプト見本だと思っといただければ。
NVENCの導入方法については
参照のこと。
前提として chinachu がユーザー chinachu のホームディレクトリにインストールされているとする。
具体的には
/home/chinachu/chinachu
に設置してる想定で書いている。
スクリプト
#!/bin/bash
log=/home/chinachu/chinachu/log/encode
dir_output="/encoded"
outfile=${1%.*}.m4v
mp4file=${outfile##*/}
echo -----start encoding @$(date +%Y/%m/%d/%H:%M:%S)----- >> $log
start=$(date +%s)
echo $1 >> $log
/home/chinachu/bin/ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -c:v mpeg2_cuvid -i "$1" -vf "yadif_cuda,scale_cuda=-2:720:interp_algo=lanczos" -c:v hevc_nvenc -preset slow -rc-lookahead 30 -c:a aac -b:a 192k -r:a 48000 -tag:v hvc1 -f mp4 -aspect 16:9 "${dir_output}/${mp4file}" 2>&1 | grep "^[^f]" >> $log
end=$(date +%s)
diff=$(expr $end - $start)
echo about $(expr $diff / 60) min. >> $log
echo ---finish encoding @$(date +%Y/%m/%d/%H:%M:%S)--- >> $log
echo >> $log
exit 0
解説
log=/home/chinachu/chinachu/log/encode
ログの吐き捨て場を指定してます。あらかじめ
touch /home/chinachu/chinachu/log/encode
しておくと良いかと。
dir_output="/encoded"
エンコードしたファイルの置き場所ですので適宜書き換えてください。
/home/chinachu/bin/ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -c:v mpeg2_cuvid -i "$1" -vf "yadif_cuda,scale_cuda=-2:720:interp_algo=lanczos" -c:v hevc_nvenc -b_ref_mode 0 -preset slow -rc-lookahead 30 -c:a aac -b:a 192k -r:a 48000 -tag:v hvc1 -f mp4 -aspect 16:9 "${dir_output}/${mp4file}" 2>&1 | grep "^[^f]" >> $log
変換部分です。chinachu付属のffmpegを使わず、自分でコンパイルしたffmpegを使用してますので、ffmpegのパスは適宜書き換えてください。
-b_ref_mode 0
この部分はH265のBフレーム対応していないGPU用に使用しないよう設定を加えています。使用する場合1
に変更してください。
使用できるのは7世代以降のNVENCチップ搭載GPUです
最後に
このスクリプトのパスを chinachu の config.json に食わせればおk
"recordedCommand": "/home/chinachu/chinachu/encoded-hevc_nvenc.sh",
これで録画後に自動でエンコードしてくれます。
NVENCだとx10ぐらいでエンコしてくれるので30分番組だと5分かからずに終わることも