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によるエンコード
手順
chinachu直下にエンコード用ディレクトリmp4を作成する。(リンクが望ましい。)
chinachu直下のlogディレクトリにエンコードログ用のmp4logディレクトリを作成する。
chinachu直下にchinachu-encode-libx264.shをコピーする。
config.jsonの中で、"recordedCommand": "./chinachu-encode-libx264.sh", を設定する。
chinachuを再起動する。
step2 h264_qsvによるエンコード

step1のmp4ディレクトリとmp4logディレクトリは、作成してください。

手順
CPUがIntel Coreの第5世代、第6世代か確認する。コマンド:cat /proc/cpuinfo
VA-APIのインストールを確認する。コマンド:vainfo
Intel Media Server Studioのインストールを確認する。コマンド:ls /opt/intel/mediasdk/
chinachu直下の/usr/bin/にffmpeg-qsvをコピーする。
chinachu直下にchinachu-encode-h264_qsv.shをコピーする。
config.jsonの中で、"recordedCommand": "./chinachu-encode-h264_qsv.sh", を設定する。
chinachuを再起動する。
2017年07月16日 | Posted in 電脳:録画サーバー | タグ: , 6 Comments » 

関連記事

コメント6件

  • ロベルト より:

    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 とニコ生の記事を書いてます

  • simplelife より:

    情報ありがとうございます。
    -hwaccel 試してみます。現在CPU負荷が60%くらいです。これが減るとさらにうれしいです。
    リサイズやインタレ解除の効果がいまいちわかっていないのと、処理時間が増えないかも気になります。
    現在、CB,VB,qによる画質とファイルサイズの関係を調査完了したので、その辺も調べることにします。

  • simplelife0530 より:

    -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

  • sphms より:

    PX-W3PE4があるので、早速CentOS7つかってみようと思います。

    1.最小版(CLIのみ)とフル版(GNOME)とどちらでお使いでしょうか。
    2.アニメや映画だとテレシネ変換して24pにすれば画質や変換効率的に有利と思われますが、試しておられますでしょうか。

  • simplelife0530 より:

    私が作成したサーバーは、PT3が2枚です。
    1.の回答 フル版(GNOME)です。マウントやファイルの操作が楽ですから。
    2.テレシネ? TVからとったTSファイルをそのままmp4にしています。余計な変換はしない方が、速く終わると思いますが。。。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください