先日、vaapiでハードウェアエンコードする環境を構築する手順を紹介しました。
vaapiでハードウェアエンコードすることによって、録画番組は1/3程度に圧縮することができます。
エンコード環境を整えたので、EPGStationと連携してエンコードができるようにしてみたいと思います。
Contents
私のサーバ
私のサーバは、LIVA Z n4200です。
スペックは一部拡張していて、以下となっています。
- ECS LIVA Z(n4200)CPU n4200 (QSV/vaapiに対応)
- eMMC 64GB(Windows領域のため使用していない)
- 拡張ストレージ SSD 120GB(加えて、外付けHDD 16TBあります)
- メモリ 16GB
EPGStation(録画環境)の構築
以下の記事を参考にして、EPGStationを使った録画環境を構築しておきます。
VAAPIエンコード環境の構築
ハードウェアエンコードをするためのffmpegをビルドします。
DockerでEPGStationを構築した方は、以下の記事を参考にして下さい。
オンプレで構築した場合も、参考にできると思います。
念のため、録画ファイルがvaapiでエンコードできるか、確認しておきます。
1 |
ffmpeg -vaapi_device /dev/dri/card0 -hwaccel vaapi -hwaccel_output_format vaapi -i ./recorded/hogehoge.m2ts -vf 'format=nv12|vaapi,hwupload,deinterlace_vaapi,scale_vaapi=w=1280:h=720' -c:v h264_vaapi -c:a ac3 -qp 20 ./recorded/hogehoge.mp4 |
上記のコマンドで動画ファイルが圧縮されていればOKです。
エンコード時に使うデバイス(-vaapi_device)は環境に合わせて調整してください。
EPGStationから使えるようにする
毎回手でコマンドを打って録画ファイルをエンコードするのも面倒なので、録画後に自動でエンコードされるようEPGStationのconifg.jsonファイルを修正してみます。
config.jsonの修正
DockerでEPGStationを構築している場合は、プロジェクトディレクトリ配下のepgstation/config/config.jsonを修正します。
1 2 |
cd ~/docker-mirakurun-epgstation/epgstation/config/ emacs config.json |
修正するのはencodeの部分です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
: (省略) "encode": [ { "name": "H264/vaapi", "cmd": "/bin/bash /app/config/enc_vaapi.sh main", "suffix": "-vaapi.mp4" }, { "name": "H264-sub/vaapi", "cmd": "/bin/bash /app/config/enc_vaapi.sh sub", "suffix": "-vaapi-sub.mp4" }, { "name": "H264", "cmd": "%NODE% %ROOT%/config/enc.js", "suffix": ".mp4" } ], (省略) : |
この修正により、EPGStationのエンコードのメニューにH264/vaapiとH264-sub/vaapiを追加します。
mainとsubは副音声番組の対応です。
例えば、CS番組(カートゥーン ネットワーク)の「きかんしゃトーマス」は二か国語放送なので、エンコード時に音声チャネルを選択しいないと訳が分からなくなります。
enc_vaapi.shの作成
vaapiエンコード時のコマンドを記述しておきます。
1 |
emacs enc_vaapi.sh |
私の環境では、こんな感じです。
そのままコピーしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/bin/bash ffprobe_cmd=/usr/local/bin/ffprobe ffmpeg_cmd=/usr/local/bin/ffmpeg mode=$1 if [ "$mode" = "" ]; then mode="main" fi function getHeight() { echo `$ffprobe_cmd -v 0 -show_streams -of flat=s=_:h=0 "$INPUT" | grep stream_0_width | awk -F= '{print \$2}'` } if [ `getHeight` -gt 720 ]; then $ffmpeg_cmd -dual_mono_mode $mode -vaapi_device /dev/dri/card0 -hwaccel vaapi -i "$INPUT" -vf 'format=nv12|vaapi,hwupload,deinterlace_vaapi,scale_vaapi=w=1280:h=720' -c:v h264_vaapi -c:a ac3 -qp 20 -ac 2 "$OUTPUT" else $ffmpeg_cmd -dual_mono_mode $mode -vaapi_device /dev/dri/card0 -hwaccel vaapi -i "$INPUT" -vf 'format=nv12|vaapi,hwupload,deinterlace_vaapi,scale_vaapi=w=720:h=480' -c:v h264_vaapi -c:a ac3 -qp 20 -ac 2 "$OUTPUT" fi |
エラーが出るようなら、-vaapi_deviceを環境に合わせて修正してください。
設定は以上です。
EPGStationで録画&エンコードしてみる
番組表から録画予約する場合
番組表から録画予約するときに、下のようにエンコードメニューが追加されるのでH264/Vaapiを選択して予約すると、録画後に自動エンコードされます。
ルールで録画予約する場合
ルールで録画予約する場合は、ルール設定画面でエンコード方法を指定します。
録画した番組を後からエンコードする場合
録画した番組をエンコードする場合は、ホーム画面の録画一覧メニューから⊕encodeを選択します。
設定からH264/Vaapiを選択して「追加」します。
エンコードリストに追加されて、順次エンコードが始まります。
まとめ
EPGStationからvaapiエンコードする方法について記事にしてみました。
これで録画番組が貯まっても、ストレージに優しくなりますね。
録画とエンコードは目的じゃなく手段
参考になれば幸いです。
コメント