いい加減録画環境を作るかということでいろいろいじっていた先でトラブったので紹介します。自分向け備忘録でもあります。ほぼバグなのでどこかで修正されるかもしれませんが、記事執筆時点の情報として残しておきます。
QSVの性能は当初と比べると非常に性能がよくなり、対応コーデックが増えるなど日進月歩という状態です。そのため、QSVには世代があり、対応するドライバや環境というのが若干違ったりします。
今回使用しているCPUはCore i3 1215U(Alder Lake)です。Linuxの環境的にはUbuntu Server 24.04です。この環境でffmpegのハードウェアエンコードを行おうと思ったところ以下のようなエラーがでました(一部抜粋)。
Error setting child device handle: -17
とか
No device available for decoder …
このメッセージが出てエンコードができない状態でした。結論から書くと以下のレポジトリを入れることで解決できました。もしくはコンパイル時にあるファイルが入ってディレクトリのパスを通すかですね。
sudo apt-get install libmfx-gen1.2
色々ドライバ周りが混沌としているのが原因だとしか言えないのですが、ドキュメントを読んだ人間が困るという奇妙なバグというか仕様です。解決の糸口になったIssueはこちら。
現在のIntelのグラフィックドライバやエンコードに使うAPIというのは、二つ必要な構成です。
一つはドライバに相当するもの、もう一つがAPIを間接的にたたいてくれるものという感じです。Linuxの画像処理向けAPIであるVideo Acceleration API (VA-API)をたたくのにIntel Media Driverが、ドライバが世代に依存するものとして、Intel Media SDKかIntel VPL GPU runtimeのどちらかが必要です。それに加えて後者のVPLの方はIntel Video Processing Library (libVPL)も必要となります。
この建付けも微妙で、libVPLはMedia SDKを使うか、VPL GPU runtimeかを振り分けるディスパッチャの役割をしてくれるというもので、以前は必要なかったものですが、VPLのGPUなら必要というものです。
さらに面倒なのが、よく資料を読むと、実はVPL GPU runtime Intel Media Driverと機能的に互換があるとのことなので、なぜか以前まではMedia SDKと合わせてVA-APIをたたくためのMedia Driverが、VPLでは名前の通りドライバの役割を果たすようになります。
注目するべきはドライバのほうで、ffmpegとQSVについての記事を見てみると古いの記事が多く、Intel Media SDKを使用していることが多いです。しかし、GitHubを見ていただくとわかりますが、Alder Lake以降の世代はIntel Media SDKはサポートしておらず、開発も終了していることがわかります。
なので、VPL仕様のものを使うには、Intel Media DriverとlibVPLの二つで機能するということになります。libVPLがディスパッチャとなり必要なドライバ、ライブラリを選択→VPL向けのドライバを選ばれる(この場合Intel Media Driver、古いGPUならMedia SDK)という感じになります。
今回の私の環境ではIntel Media DriverとlibVPLが入っているので適切にディスパッチャが機能すれば正しくVA-APIを使用できるということになります。
しかし、現状のffmpegではIntel Media SDKの多くに依存しており、oneVPLのライブラリを参照するように設定を行う必要があるようです。UbuntuなどのマシンではMedia SDKがデフォルトでは/opt/intelに入るためその部分は参照するように考慮されていますが、VPL用のものは/usr/libに入っているlibmfx-gen.so.1.2を参照しない状態のようです。なので、明示的にLD_LIBRARY_PATH に (libmfx-gen.so.1.2の入っているディレクトリ、つまり/opt/intel/libや/usr/local/libのような)パスを通すことで使えるようになるというのが原因です。パスが通っていないのが悪いといえばそうなのですが、ドライバ周りが混沌としていて、使用者側や設計者側が追えない状態になっているのが一番の問題な気がします。
どれくらいこれに沼る人がいるかわかりませんが、私の備忘録次いでに情報を残しておきます。
以上です。お読みいただきありがとうございました。