狠狠撸

狠狠撸Share a Scribd company logo
今時のLinuxにおける
GPUエンコーディング事情
2018年末版
安藤 達也(zgock)
東海道らぐ
openSUSEユーザ会
zgock?お前誰よ?
安藤と申します
愛知県の隅っこで流しのエンジニアやってます
openSUSE使いです
ただの家庭内rootです
以前東海道らぐのLT用に起こしたXenのスライ
ドが狠狠撸Shareで40000ビュー超えてて吹い
たw
「Xenとzfsで作る家庭内VDIサーバ」
最近「仮想化ヲタ」というより
「VGAヲタ」であると気づきました
世間の人はVGA二桁枚も常備してないね、うん
録画データ、溜まってませんか?
はい、うちは溜まってます
家庭内録画環境は円熟期に
PT2/PT3等の録画カードの普及
優秀な録画用アプライアンスの登場
EPGStation
Chinanchu
ts2形式で保存すると1時間の地デジ/BS番組
で数GBのサイズに
真田丸全50話録画して
一話6GB*50=300GB
エンコード、重いですよね
Linuxではソフトウェアエンコーディングが
主流
x264等が下位レイヤ
各種変換ツールが上位レイヤ
ffmpeg
HandBrake
CPUにもよるけど、実時間等速変換ぐらいが精
一杯
1時間の番組を変換するのに1時間
CPU100%使うので他のことが出来ない
GPUがあるじゃない
GPUエンコーディングおさらい
過去何回も紹介してるのでまとめとして
AMD VCE(Video Coding Engine)
NVIDIA NVENC(NVidia ENCoder)
Intel QSV(Quick Sync Video)
Linuxで扱うには(過去形)
Intel QSV
Intel Media SDKが必要
カーネル決め打ち&brob driverで制約が多い
現行iGPUのみ対応で過去製品はガンガン切り捨てる
AMD VCE
amdgpuドライバの登場前はwindowsのみ
amdgpuドライバ登場後にgstreamerが対応
NVIDIA NVENC
NVIDIA SDKで対応
ffmpegが対応しているが配布ライセンスの都合上
自前ビルドが必要
2018年現在、事情が変わってきました
VA-API
Linux上での汎用デコード/エンコードAPI
Intel/AMDのGPUデコーダ/エンコーダに対応
標準IntelドライバでSandyBridge以降対応
ffmpeg等でハンドリング可能
iGPUの機能をフル活用するわけではないので、
Media SDKと比較して速度?画質等落ちる
Broadwell以降対応のIntel製OSSドライバがある
MediaSDKと同等のフル機能が扱える
openSUSE Tumbleweedであれば標準パッケにある
zypper in intel-media-driver
ffmpegでVA-APIを使う
ffmpeg 4.0
VA-API周辺に大幅な最適化が入った
適切なドライバを使えば3.x比で1.5倍速に
openSUSE Tumbleweedでは標準パッケに
zypper in ffmpeg-4
Leap 15.1(2月リリース予定)でLeapにも入るとい
いなあ
ffmpegでVA-API 前準備(1)
ドライバの確認
ls /usr/lib64/dri
ほにゃらら_drv_video.soがVA-APIドライバ
i965_drv_video.so
libva標準のIntelドライバ(SandyBridge以降)
iGPUのフル機能は使ってないので性能はMedia
SDKよりやや落ちる
iHD_drv_video.so
Intel拡張VA-APIドライバ(Broadwell以降専
用)
Media SDKとほぼ同等の性能
radeonsi_drv_video.so
標準のAMDドライバ
ffmpegでVA-API 前準備(2)
ドライバの詳細確認
zypper in libva-utils
VA-API確認ツール「vainfo」のインストール
export LIBVA_DRIVER_NAME=iHD
確認したドライバの1st wordを指定
vainfo
対応しているフォーマットを確認できる
「VAEntrypointEncSlice」エンコード対応
「VAEntrypointVLD」デコード対応
iHDドライバはh264、HEVC(h265)のエンコードに
対応
i965ドライバはVP8にも対応
ただしフルハードエンコードではないので遅い
ffmpegでVA-API エンコード
ffmpeg
–vaapi_device /dev/dri/renderD128
-hwaccel vaapi
-hwaccel_output_format vaapi
-i input.ts ←入力ファイル
-vf ‘format=nv12|
vaapi,hwupload,deinterlace_vaapi’
-c:v h264_vaapi
-c:a ac3
-qp 20
output.mp4
ffmpegでVA-API オプション解説
–vaapi_device /dev/dri/renderD128
VA-APIで使うデバイスを指定
マザー実装やプライマリ/セカンダリで使えるデバイ
スが異なる場合がある
大概は/dev/dri/renderDほにゃららで良いが
/dev/dri/cardほにゃららでないとダメな場合がある
ls /dev/driで使えるデバイス一覧を見て
指定してエラーにならないデバイスを探す(雑)
ffmpegでVA-API オプション解説
-hwaccel vaapi
デコーダにVA-APIを使用する
-hwaccel_output_format vaapi
エンコーダにVA-APIを使用する
-i input.ts
入力ファイルを指定
VA-APIの詳細オプションを渡す前に指定する
必要があるため、必ず以降のオプションより前
に指定しなければならない
ffmpegでVA-API オプション解説
-vf ‘format=nv12|
vaapi,hwupload,deinterlace_vaapi,scale_vaapi
=1280x800’
VA-APIの詳細オプション
format=nv12|vaapi
デコードフォーマット、intelの場合これで固定
hwupload
ハードウェアデコーダからエンコーダに直接スト
リームを送る
deinterlace_vaapi
ハードウェアフィルタによるインターレース解除
scale_vaapi=1280x800
ハードウェアフィルタによるスケーリング
ffmpegでVA-API オプション解説
-c:v h264_vaapi
ビデオエンコーディングフォーマットを指定す
る
-c:v hevc_vaapiでh265エンコード
-c:a ac3
オーディオエンコーディングフォーマットを指
定する
エンコード不要(-c:a copy)でも良いが、TV放送の
aacはmp4コンテナに本来収められない形式なので
bitstream errorが出る
-fflags +discardcorrupt と –bsf:a
aac_adtstoascを付けることで回避はできる
オーディオエンコード分の負荷は誤差
ffmpegでVA-API オプション解説
-qp 20
エンコード品質(ビットレート)の設定
一番のキモ
-qp 1で最も高画質大容量、-qp 99で最も低画
質小容量になる
-cbr、-vbr等でビットレート指定可能ではあ
るが、intel qsvでは-qp指定が一番良好な結果
が出る
実用的には –qp 15~18でほぼ無劣化、-qp 30
あたりがほぼ限界画質(このへんは主観)
実機テスト
Fujitsu FUTRO MS936
富士通のビジネスシンクライアント
Celeron 3955U (Skylake)
楽天で中古が9980円だった
32GB SSDを500GBに交換してTumbleweed
実機テスト
テストソース 地上デジタル録画 30分のア
ニメ
ガンダムビルドファイターズ第五話(約3.2GB)
iHD(速度) iHD(サイズ) i965(速度) i965(サイズ)
-qp 18 h264 x6.5 1.7GB x4.1 1.8GB
-qp 20 x6.5 1.2GB x4.2 1.3GB
-qp 25 x6.5 632MB x4.1 721MB
-qp 30 x6.5 334MB x4.1 392MB
-qp 35 x6.5 208MB x4.0 262MB
-qp 20 hevc x2.2 1.2GB x1.6 1.3GB
サンプル再生タイム
これよりただのアニメ鑑賞会になります
まとめ
最近のCeleronあなどれん
なぁ
ありがとうございました!

More Related Content

今时の尝颈苍耻虫における骋笔鲍エンコード事情2018