CentOSでQSVを使用する
Linux (CentOS 7.1)でQSVを使用してエンコードする実験を行った。

こんな感じで実行できる。
実験環境
CentOS 7.1.1503 x64
Intel Core i7 4770K
Asrock Z97E-ITX/ac
RAM 8GB
SSD TOSHIBA THNSNJ128GCST 128GB
必要なもの
このあと書いていくけど、
QSVEnc 2.19
ベースとなる開発環境
C++11コンパイラ (g++ / clang++)
Media SDKのインストール
yasmのインストール
のあたりが必要。
Media SDKのインストール (必須)
CentOSでQSVを実行するにはMedia SDKのインストールが必要なので、手順に従ってインストールし、付属バイナリでのインストールテストを行う。
libmfx.aの配置がどうの、という記述がネット上に存在するが、QSVEncは自前でlibmfxを含むので気にしない。
ライブラリのビルド (オプション)
QSVEncCでオプションとして使用可能なffmpeg、VapourSynth、Avxsynthをビルド・インストールしておくと、QSVEncでこれらを使用した機能が有効になる。
QSVEncのビルド
yasmがインストールされていなければ、インストールする。
QSVEnc2.19以降をダウンロードする。
QSVEncをビルドする。
ひとまずgcc 4.8.3 / gcc 5.2.0 / clang++ 4.3ではコンパイルできた。
ffmpeg、VapourSynth、Avxsynthなどのライブラリがインストールされていれば、自動的に検出され、それらを用いた機能が有効になる。
※記事中のスクリーンショットは2.18とバージョン表示されていますが、開発中だったためです。
configure後

qsvenccがビルドできた。

実行

vslsmashsource経由できちんとQSVエンコードできている。
また、avxsynthでもエンコード可能。

機能一覧
QSVEncC (x64) 2.18 by rigaya, Oct 26 2015 06:46:18 (gcc 4.8.3/Linux/avx2)
based on Intel(R) Media SDK Encoding Sample 6,0,0,98947
avi reader: disabled
avs reader: enabled
vpy reader: enabled
avqsv reader: enabled [H.264/AVC, HEVC, MPEG2, VC-1]
Environment Info
OS : CentOS Linux release 7.1.1503 (Core) (x64)
CPU: Intel Core i7-4770K @ 3.50GHz [TB: 4.20GHz] (4C/8T) <Haswell>
RAM: Used 2343 MB, Total 7429 MB
GPU: Intel Graphics / Driver : 16.4.2.1.39163-ubit
Media SDK Hardware API v1.16
Supported Enc features:
Codec: H.264/AVC
ICQが動作しない…残念すぎる。ドライバのせいなのだろうか?
QSVEncのコードに大量の変更を加えて、なんとか動くようにした。実験の結果、CQPならひとまずちゃんと動いているようでよかった。
コードのLinux対応は、基本的にはWindowsのAPIをC++11に置き換えたり、WindowsのAPIに対応するLinux版コードを書いて疑似的に再現したりといったところ。時間取得関係がC++11のchronoで済ませられたのはよかったが、スレッド関係はC++11だけで完全に置き換えられず、SetEvent/WaitForSingleObjectもどきとかを作ったりした。
まだ不安定なことがあるのと、Windows版にあるいくつかの機能はLinuxでは動作しない/若干動作が違うのが仕様だったりするので注意。
あと、あんまりLinuxのことは知らないので、なんか変なことをしているかもしれない。
Skylakeで動かない → まだ対応してないらしい
Braswellで動かない → そもそも対応してないらしい、回路は載ってるはずなのに
VP8は? → 未検証です
chronoとかalignasとかがないとか言われる → gccがふるいのかも?
ビルド中警告が出る → 出ます、そういうものです
Linuxのxxxがわかりません → きっとわたしにもわかりません
対応OSは? → Media SDKがCentOS 7.1のサポートのみらしいです
Windowsでgccビルド → gccビルドはLinux専用です

こんな感じで実行できる。
実験環境
CentOS 7.1.1503 x64
Intel Core i7 4770K
Asrock Z97E-ITX/ac
RAM 8GB
SSD TOSHIBA THNSNJ128GCST 128GB
必要なもの
このあと書いていくけど、
QSVEnc 2.19
ベースとなる開発環境
C++11コンパイラ (g++ / clang++)
Media SDKのインストール
yasmのインストール
のあたりが必要。
Media SDKのインストール (必須)
CentOSでQSVを実行するにはMedia SDKのインストールが必要なので、手順に従ってインストールし、付属バイナリでのインストールテストを行う。
libmfx.aの配置がどうの、という記述がネット上に存在するが、QSVEncは自前でlibmfxを含むので気にしない。
ライブラリのビルド (オプション)
QSVEncCでオプションとして使用可能なffmpeg、VapourSynth、Avxsynthをビルド・インストールしておくと、QSVEncでこれらを使用した機能が有効になる。
QSVEncのビルド
yasmがインストールされていなければ、インストールする。
tar -xvf yasm*.tar.gz
cd yasm*/
./configure
make -j8 && sudo make install
cd ..
QSVEnc2.19以降をダウンロードする。
QSVEncをビルドする。
unzip QSVEnc_*.zip
cd QSVEnc*/
7za x QSVEnc_src.7z
cd QSVEnc
./configure
make -j8 && sudo make install
cd ..
ひとまずgcc 4.8.3 / gcc 5.2.0 / clang++ 4.3ではコンパイルできた。
ffmpeg、VapourSynth、Avxsynthなどのライブラリがインストールされていれば、自動的に検出され、それらを用いた機能が有効になる。
※記事中のスクリーンショットは2.18とバージョン表示されていますが、開発中だったためです。
configure後

qsvenccがビルドできた。

実行

vslsmashsource経由できちんとQSVエンコードできている。
また、avxsynthでもエンコード可能。

機能一覧
QSVEncC (x64) 2.18 by rigaya, Oct 26 2015 06:46:18 (gcc 4.8.3/Linux/avx2)
based on Intel(R) Media SDK Encoding Sample 6,0,0,98947
avi reader: disabled
avs reader: enabled
vpy reader: enabled
avqsv reader: enabled [H.264/AVC, HEVC, MPEG2, VC-1]
Environment Info
OS : CentOS Linux release 7.1.1503 (Core) (x64)
CPU: Intel Core i7-4770K @ 3.50GHz [TB: 4.20GHz] (4C/8T) <Haswell>
RAM: Used 2343 MB, Total 7429 MB
GPU: Intel Graphics / Driver : 16.4.2.1.39163-ubit
Media SDK Hardware API v1.16
Supported Enc features:
Codec: H.264/AVC
CBR | VBR | AVBR | QVBR | CQP | VQP | LA | LAHRD | ICQ | LAICQ | VCM | |
---|---|---|---|---|---|---|---|---|---|---|---|
RC mode | ○ | ○ | ○ | × | ○ | ○ | × | × | × | × | × |
Fixed Func | × | × | × | × | × | × | × | × | × | × | × |
Interlace | ○ | ○ | ○ | × | ○ | ○ | × | × | × | × | × |
SceneChange | ○ | ○ | ○ | × | ○ | ○ | × | × | × | × | × |
VUI info | ○ | ○ | ○ | × | ○ | ○ | × | × | × | × | × |
Trellis | × | × | × | × | × | × | × | × | × | × | × |
Adaptive_I | ○ | ○ | ○ | × | ○ | ○ | × | × | × | × | × |
Adaptive_B | ○ | ○ | ○ | × | ○ | ○ | × | × | × | × | × |
WeightP | × | × | × | × | × | × | × | × | × | × | × |
WeightB | × | × | × | × | × | × | × | × | × | × | × |
B_Pyramid | ○ | ○ | ○ | × | ○ | × | × | × | × | × | × |
+Scenechange | × | × | × | × | × | × | × | × | × | × | × |
+ManyBframes | ○ | ○ | ○ | × | ○ | × | × | × | × | × | × |
Ext_BRC | × | × | × | × | × | × | × | × | × | × | × |
MBBRC | × | × | × | × | × | × | × | × | × | × | × |
LA Quality | × | × | × | × | × | × | × | × | × | × | × |
QP Min/Max | ○ | ○ | ○ | × | ○ | ○ | × | × | × | × | × |
IntraRefresh | × | × | × | × | × | × | × | × | × | × | × |
No Debloc | ○ | ○ | ○ | × | ○ | ○ | × | × | × | × | × |
Windowed BRC | × | × | × | × | × | × | × | × | × | × | × |
PerMBQP(CQP) | × | × | × | × | × | × | × | × | × | × | × |
DirectBiasAdj | × | × | × | × | × | × | × | × | × | × | × |
MVCostScaling | × | × | × | × | × | × | × | × | × | × | × |
ICQが動作しない…残念すぎる。ドライバのせいなのだろうか?
QSVEncのコードに大量の変更を加えて、なんとか動くようにした。実験の結果、CQPならひとまずちゃんと動いているようでよかった。
コードのLinux対応は、基本的にはWindowsのAPIをC++11に置き換えたり、WindowsのAPIに対応するLinux版コードを書いて疑似的に再現したりといったところ。時間取得関係がC++11のchronoで済ませられたのはよかったが、スレッド関係はC++11だけで完全に置き換えられず、SetEvent/WaitForSingleObjectもどきとかを作ったりした。
まだ不安定なことがあるのと、Windows版にあるいくつかの機能はLinuxでは動作しない/若干動作が違うのが仕様だったりするので注意。
あと、あんまりLinuxのことは知らないので、なんか変なことをしているかもしれない。
Skylakeで動かない → まだ対応してないらしい
Braswellで動かない → そもそも対応してないらしい、回路は載ってるはずなのに
VP8は? → 未検証です
chronoとかalignasとかがないとか言われる → gccがふるいのかも?
ビルド中警告が出る → 出ます、そういうものです
Linuxのxxxがわかりません → きっとわたしにもわかりません
対応OSは? → Media SDKがCentOS 7.1のサポートのみらしいです
Windowsでgccビルド → gccビルドはLinux専用です
スポンサーサイト