Chinachu γ(CentOS7.3)でQSVエンコード(2)
目次
(2018年8月13日追記) CentOS 7.4でqsvを利用しています。 CentOS 7.4「Chinachu γ + plex + qsv」の構築ポイント
Chinachu γでQSVエンコードするための手順を紹介します。
前提条件
Hardware: 第五世代、第六世代のインテル® Core™ プロセッサー
Software: CentOS 7でChinachu γを動かして、録画が正常にできること。
条件を少し詳細に述べると
CPU
以下のいずれかのCPUを使っていること。
- インテル® Xeon® プロセッサー E3-1200 v4 製品ファミリー
- インテル® Xeon® プロセッサー E3-1200/E3-1500 v5 製品ファミリー
- 第 5 世代インテル® Core™ プロセッサー
- 第 6 世代インテル® Core™ プロセッサー
以下のコマンドを実行して、確認してください。
[cuser@local ~]$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 94
model name : Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
stepping : 3
microcode : 0x9e
OS
CentOS7.2(1511)がIntel推奨。
私が使っているCentOS7.3(1611)でも問題なく動作します。
その他のLinuxディストリビューション でも動くがIntelは保証はしないらしい。
IntelもCentOSが一押しのようだ。
以下のコマンドを実行して、確認してください。
[cuser@local ~]$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
[cuser@local ~]$ uname -a
Linux tango 3.10.0-327.10.1.el7.x86_64 #1 SMP Tue Feb 16 17:03:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
全体の設定手順
Chinachu γがきちんと動いていれば、30分もあれば設定できます。
(1)ffmpeg-qsv(QSV対応ffmpeg)の作成
chinachuディレクトリ直下に/usr/bin/ffmpeg-qsvを置きます。
(2)エンコード用スクリプトchinachu-encode-h264_qsv.shの設置
chinachuディレクトリ直下にchinachu-encode-h264_qsv.shを置きます。
(3)config.jsonにエンコード用スクリプトを指定します。
config.jsonのrecordedCommand:に記述します。
"recordedCommand": "./chinachu-encode-h264_qsv.sh",
(1)ffmpeg-qsv(QSV対応ffmpeg)の作成
以下の手順で、作成します。
(1-1)VAAPI/Intelドライバのインストール
CentOSでVAAPIを利用するために、libvaとlibva-intel-driverが必要です。
ここを参考にインストールしてください。
インストール後、以下のコマンドを実行して確認してください。
[cuser@local chinachu]$ vainfo
libva info: VA-API version 0.99.0
libva info: va_getDriverName() returns 0
libva info: User requested driver 'iHD'
libva info: Trying to open /opt/intel/mediasdk/lib64/iHD_drv_video.so
libva info: Found init function __vaDriverInit_0_32
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.99 (libva 1.67.0.pre1)
vainfo: Driver version: 16.5.1.59511-ubit
vainfo: Supported profile and entrypoints
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264ConstrainedBaseline:
VAProfileH264ConstrainedBaseline:
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264Main :
VAProfileH264Main :
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileH264High :
VAProfileH264High :
VAProfileMPEG2Simple : VAEntrypointEncSlice
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointEncSlice
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Simple : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointEncPicture
VAProfileVP8Version0_3 : VAEntrypointEncSlice
VAProfileVP8Version0_3 : VAEntrypointVLD
VAProfileVP8Version0_3 :
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSlice
VAProfileVP9Profile0 :
: VAEntrypointVideoProc
VAProfileNone : VAEntrypointVideoProc
VAProfileNone :
(1-2)Intel Media Server Studio 2017R2 for Linuxのインストール
(1-3)ffmpeg-qsvの作成
この部分は、このサイトの情報を参考にすればインストールできます。
Intel Media Server Studio 2017R2をインストール後、以下のコマンドを実行して確認してください。
cuser@local chinachu]$ ls /opt/intel/mediasdk/
doc include lib lib64 opensource plugins samples tools
ffmpegがビルドできたら、以下のコマンドを実行して確認してください。
[cuser@local bin]$ /tmp/ffmpeg-3.2.3/ffmpeg -version
ffmpeg version 3.2.3 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-11)
configuration: --enable-libmfx
libavutil 55. 34.101 / 55. 34.101
libavcodec 57. 64.101 / 57. 64.101
libavformat 57. 56.101 / 57. 56.101
libavdevice 57. 1.100 / 57. 1.100
libavfilter 6. 65.100 / 6. 65.100
libswscale 4. 2.100 / 4. 2.100
libswresample 2. 3.100 / 2. 3.100
ffmpegのバージョンが確認できたら、chinachuで録画したtsファイルをmp4にエンコードしてください。
/tmp/ffmpeg-3.2.3/ffmpeg -i sample.ts -vcodec h264_qsv sample.mp4
mp4ファイルが作成できたら、/tmp/ffmpeg-3.2.3/ffmpegの名前をffmpeg-qsvに変えて、chinachuディレクトリ配下の/usr/bin/にコピーしてください。chinachuで使っているffmpegはそのまま残すため、名前を変えました。
(2)エンコード用スクリプトchinachu-encode-h264_qsv.shの設置
(2-1)mp4を保存するディレクトリを作成する。
chinachuディレクトリ配下にmp4ディレクトリを作成する。リンクで作成すると拡張する際便利です。
(2-2)エンコードログを保存するディレクトリを作成する。
chinachuディレクトリ配下にlog/mp4logディレクトリを作成する。
(2-3)chinachuディレクトリ配下に、以下のスクリプトをコピーする。
#!/bin/sh
#chinachu-encode-h264_qsv.sh
# added "-y" option
# version 1.1 created on 2017-07-19 by simplelife0530
export LIBVA_DRIVERS_PATH=/opt/intel/mediasdk/lib64
export LIBVA_DRIVER_NAME=iHD
export MFX_HOME=/opt/intel/mediasdk
export PKG_CONFIG_PATH=/opt/intel/opencl:
function setStartTime() {
start_time=`date +%s`
}
function getEndTime() {
end_time=`date +%s`
process_time=`expr ${end_time} - ${start_time}`
}
function displayTime() {
HH=`expr ${2} / 3600`
SS=`expr ${2} % 3600`
MM=`expr ${SS} / 60`
SS=`expr ${SS} % 60`
echo "${1} = ${2} 秒 ${HH}時間${MM}分${SS}秒"
}
#出力ファイルの設定
file=${1##*/}
filename=${file%.*}
outExt=".mp4"
outputFile="./mp4/"$filename$outExt
#ログファイルの設定
logExt=".log"
logFile="./log/mp4log/log"$filename$logExt
#番組情報をログに書き出す
{
echo "-------------------------番組名--------------------------"
echo "$1"
echo ""
echo "-------------------------番組情報------------------------"
echo "$2"
echo ""
} > $logFile
#他にエンコードしている場合は待つ
until [ ! `pidof -s ffmpeg-qsv` ]
do
sleep 60
done
#エンコード設定
input=" -y -i "
videoCodec=" -vcodec h264_qsv"
videoOpt=" -q 23 -look_ahead 0"
#videoOpt=" -q 23 -vf yadif -look_ahead 0"
audioCodec=" -acodec aac"
audioOpt=""
#audioOpt=" -strict -2 -ac 2 -ar 48000 -ab 128k"
advancedOpt=" -threads 4 -loglevel error "
command="./usr/bin/ffmpeg-qsv"$input\"$1\"$videoCodec$videoOpt$audioCodec$audioOpt$advancedOpt\"$outputFile\"
#エンコード開始
{
echo "----------------------エンコードコマンド------------------"
echo "${command}"
echo ""
echo "----------------------エンコード開始----------------------"
} >> $logFile
setStartTime
eval ${command} >> $logFile 2>&1
{
echo ""
echo "----------------------エンコード情報-----------------------"
getEndTime
displayTime "処理時間" ${process_time}
duration=`./usr/bin/ffprobe "$outputFile" -hide_banner -show_entries format=duration | sed -n 2p`
recordingTime=${duration#duration=}
displayTime "録画時間" ${recordingTime%.*}
compressSpeed=`echo "scale=2; ${recordingTime}/${process_time}" | bc`
echo "エンコード速度 = ${compressSpeed} 倍"
inputFileSize=`ls -l "$1" | awk '{ print $5; }'`
echo "入力ファイル = $inputFileSize bytes"
outputFileSize=`ls -l "$outputFile" | awk '{ print $5; }'`
echo "出力ファイル = $outputFileSize bytes"
compressionRate=`echo "scale=2; ${outputFileSize}/${inputFileSize}*100" | bc`
echo "圧縮率 = ${compressionRate} %"
echo "----------------------エンコード終了------------------------"
echo ""
} >> $logFile
exit
設定完了すると以下のようになります。赤丸が今回追加したものです。
(3)config.jsonにエンコード用スクリプトを指定します。
Chinachu γの右上にある「設定」をクリックすると、以下の画面が表示されます。赤丸のところに、以下のように記述してください。
"recordedCommand": "./chinachu-encode-h264_qsv.sh",
これで完成です。
qsvエンコードの実行
設定が完了すると、Chinachuで録画されたファイルは、自動的にmp4にエンコードされて、chinachu配下のmp4ディレクトリに保存されます。本スクリプトの機能を以下に説明します。
(1)QSVエンコードは、常に一つだけ実行されます。重なる時は、現在行っているエンコードが終了するまで待ちます。
(2)エンコードの状況は、ログに記録されます。chinachuディレクトリ配下のlog/mp4logに保存されます。
ログの一例は以下のとおりです。
-------------------------番組名--------------------------
./tv/プレミアムドラマ 定年女子(1)[新]<全8回>[字][170709-2200][BS15_1].ts
-------------------------番組情報------------------------
{"id":"idp3u5q","category":"drama","title":"プレミアムドラマ 定年女子<全8回>","fullTitle":"プレミアムドラマ 定年女子(1)[新]<全8回>[字]","detail":"会社の定年は本当の定年ではない!女には定年はないのだ!現代の女性のセカンドライフを、リアルな視点とユーモアで描くハートウォーミングドラマ。\n◇番組内容\n商社で部長を務める深山麻子(南果歩)、53歳。仕事は順調だったが、突然役職定年を言い渡される。納得がいかない麻子は、飲み会で泥酔して男性客(山口祐一郎)にからむ。今までのキャリアは何だったのか!その上、元夫の聡(寺脇康文)と姑・登美子(草笛光子)がやって来てはマイペースに大騒ぎ。次の異動先食品事業部で心機一転頑張ることを決めた麻子は、溝口(町田啓太)と出会う。50代定年女性の未来は果たして!\n◇出演者\n【出演】南果歩,草刈民代,菊池桃子,石野真子,清水ミチコ,町田啓太,山下リオ,寺脇康文,山口祐一郎,草笛光子\n◇原作・脚本\n【脚本】田渕久美子,【原案】岸本裕紀子\n◇音楽\n【音楽】羽深由理","start":1499605200000,"end":1499608200000,"seconds":3000,"description":"会社の定年は本当の定年ではない!女には定年はないのだ!現代の女性のセカンドライフを、リアルな視点とユーモアで描くハートウォーミングドラマ。","extra":{"番組内容":"商社で部長を務める深山麻子(南果歩)、53歳。仕事は順調だったが、突然役職定年を言い渡される。納得がいかない麻子は、飲み会で泥酔して男性客(山口祐一郎)にからむ。今までのキャリアは何だったのか!その上、元夫の聡(寺脇康文)と姑・登美子(草笛光子)がやって来てはマイペースに大騒ぎ。次の異動先食品事業部で心機一転頑張ることを決めた麻子は、溝口(町田啓太)と出会う。50代定年女性の未来は果たして!","出演者":"【出演】南果歩,草刈民代,菊池桃子,石野真子,清水ミチコ,町田啓太,山下リオ,寺脇康文,山口祐一郎,草笛光子","原作・脚本":"【脚本】田渕久美子,【原案】岸本裕紀子","音楽":"【音楽】羽深由理"},"channel":{"type":"BS","channel":"BS15_1","name":"NHKBSプレミアム","id":"8kpz","sid":103,"nid":4,"hasLogoData":false,"n":33},"subTitle":"","episode":1,"flags":["新","字"],"isConflict":false,"recordedFormat":"","priority":2,"tuner":{"name":"Mirakurun (UnixSocket)","command":"*","isScrambling":false},"command":"mirakurun type=BS url=/api/programs/40010311790/stream?decode=1 priority=2","recorded":"./tv/プレミアムドラマ 定年女子(1)[新]<全8回>[字][170709-2200][BS15_1].ts"}
----------------------エンコードコマンド------------------
./usr/bin/ffmpeg-qsv -i "./tv/プレミアムドラマ 定年女子(1)[新]<全8回>[字][170709-2200][BS15_1].ts" -vcodec h264_qsv -q 23 -look_ahead 0 -acodec aac -threads 4 -loglevel error "./mp4/プレミアムドラマ 定年女子(1)[新]<全8回>[字][170709-2200][BS15_1].mp4"
----------------------エンコード開始----------------------
[mpeg2video @ 0x1e39020] Invalid frame dimensions 0x0.
libva info: VA-API version 0.99.0
libva info: va_getDriverName() returns 0
libva info: User requested driver 'iHD'
libva info: Trying to open /opt/intel/mediasdk/lib64/iHD_drv_video.so
libva info: Found init function __vaDriverInit_0_32
libva info: va_openDriver() returns 0
Last message repeated 4 times
[mpeg2video @ 0x20aa860] ac-tex damaged at 81 33
[mpeg2video @ 0x20aa860] Warning MVs not available
[aac @ 0x20aad00] TYPE_FIL: Input buffer exhausted before END element found
Error while decoding stream #0:1: Invalid data found when processing input
----------------------エンコード情報-----------------------
処理時間 = 506 秒 0時間8分26秒
録画時間 = 3000 秒 0時間50分0秒
エンコード速度 = 5.93 倍
入力ファイル = 7862748252 bytes
出力ファイル = 1095967507 bytes
圧縮率 = 13.00 %
----------------------エンコード終了------------------------
番組の情報、エンコードの処理状況、エンコード速度、圧縮率などがわかります。
(3)エンコード品質は、-q 23のオプションを使用しています。ここは、まだ調整が必要な部分で、自分の好みの設定を検討してください。
おまけ:クイックインストールガイド
簡単にインストールするために、ガイドを作成しました。
一度に変更すると、わからなくなるので、2段階でのインストールをお勧めします。
STEP 1では、chinachu γが正常に動いている状態で、すぐに実行できる内容です。
mp4用の保存ディレクトリ、mp4エンコードのログディレクトリの作成とlibx264を使ったエンコードのスクリプトの設置です。
まず、これができれば、録画ファイルのmp4への圧縮は成功です。
STEP 2では、qsv対応ffmpegの作成とそのエンコード用スクリプトの設置です。
これで、mp4への圧縮時間は、libx264に比較しておよそ1/7にすることができます。
step1 libx264によるエンコード
番 | 手順 |
---|---|
1 | chinachu直下にエンコード用ディレクトリmp4を作成する。(リンクが望ましい。) |
2 | chinachu直下のlogディレクトリにエンコードログ用のmp4logディレクトリを作成する。 |
3 | chinachu直下にchinachu-encode-libx264.shをコピーする。chinachu-encode-libx264.sh 1 ファイル 2.55 KB
|
4 | config.jsonの中で、"recordedCommand": "./chinachu-encode-libx264.sh", を設定する。 |
5 | chinachuを再起動する。 |
step2 h264_qsvによるエンコード
step1のmp4ディレクトリとmp4logディレクトリは、作成してください。
番 | 手順 |
---|---|
1 | CPUがIntel Coreの第5世代、第6世代か確認する。コマンド:cat /proc/cpuinfo |
2 | VA-APIのインストールを確認する。コマンド:vainfo |
3 | Intel Media Server Studioのインストールを確認する。コマンド:ls /opt/intel/mediasdk/ |
4 | chinachu直下の/usr/bin/にffmpeg-qsvをコピーする。ffmpeg-qsv 1 ファイル 6.90 MB
|
5 | chinachu直下にchinachu-encode-h264_qsv.shをコピーする。chinachu-encode-h264_qsv.sh 1 ファイル 2.54 KB
|
6 | config.jsonの中で、"recordedCommand": "./chinachu-encode-h264_qsv.sh", を設定する。 |
7 | chinachuを再起動する。 |
関連記事
コメント6件
情報ありがとうございます。
-hwaccel 試してみます。現在CPU負荷が60%くらいです。これが減るとさらにうれしいです。
リサイズやインタレ解除の効果がいまいちわかっていないのと、処理時間が増えないかも気になります。
現在、CB,VB,qによる画質とファイルサイズの関係を調査完了したので、その辺も調べることにします。
-hwaccel qsvを早速試してみましたが、以下のエラーが出て終了しませんでした。
QSV transcoding is not initialized. -hwaccel qsv should only be used for one-to-one QSV transcoding with no filters.
qsv hwaccel requested for input stream #0:0, but cannot be initialized.
実行したコマンドは以下ですが、何か問題あるのでしょうか。
./usr/bin/ffmpeg-qsv -hwaccel qsv -vcodec h264_qsv -y -i “sample.ts” -q 23 -look_ahead 0 -acodec aac -loglevel error “sample.mp4”
ごめんなさい。-vcodec h264_qsv -i input.ts で一般の TS は MPEG-2 なので
これだとデコードエラーになります。なのでデコーダーを直します。
アニメの場合
ffmpeg -hwaccel qsv -vcodec mpeg2_qsv -i input.ts -vf deinterlace_qsv,scale_qsv=1280:-1,hwdownload,format=nv12,fps=30000/1001,decimate -vcodec h264_qsv -look_ahead 0 -q 25 -acodec copy out.mp4
PX-W3PE4があるので、早速CentOS7つかってみようと思います。
1.最小版(CLIのみ)とフル版(GNOME)とどちらでお使いでしょうか。
2.アニメや映画だとテレシネ変換して24pにすれば画質や変換効率的に有利と思われますが、試しておられますでしょうか。
私が作成したサーバーは、PT3が2枚です。
1.の回答 フル版(GNOME)です。マウントやファイルの操作が楽ですから。
2.テレシネ? TVからとったTSファイルをそのままmp4にしています。余計な変換はしない方が、速く終わると思いますが。。。
HW デコードすると CPU 負荷を減らせます
さらに リサイズやインタレ解除も出来ます
http://nico-lab.net/installing_qsv_with_ffmpeg/ より
ffmpeg -hwaccel qsv -vcodec h264_qsv -i input.ts -vf deinterlace_qsv,scale_qsv=1280:-1,hwdownload,format=nv12,fps=30000/1001,decimate -vcodec h264_qsv -look_ahead 0 -q 25 -acodec copy out.mp4
普段は ffmpeg とニコ生の記事を書いてます