わくわく計算ライフ

ドムプラをキメつづけるブログになりつつある。

RustでGStreamerを使いたい(準備編)

クジラ本によるRustの学習が一通り完了したので、kirimaroのRust版の製作をしようと思っています。
今回はGStreamerを使おうと思ったのでその準備について整理します。(2022/3/13時点)

1. GStreamerって何ぞ?

gstreamer.freedesktop.org

マルチメディアデータを取り扱うための有名オープンソースソフトウェア。
多用なプラットフォームでサポートされている。
基本的には[FFmpeg(https://ffmpeg.org/)と用途は近い。

公式でRustバインディングが用意されているのと、OpenCV界隈でもバックエンドをデフォルトのFFmpegからGStreamerに変えたら速くなった!みたいな情報をちょくちょく見るので今回使ってみようかと思っています。
話はずれますがOpenCVでGStreamer使うにはビルドしなきゃいけないっぽくてちょっとめんどい。
GStreamerはちょこっとは触ったことがありますが、慣れないとパイプラインの構築とかのお作法がめんどくさそうではあります。
Python版のkirimaroはFFmpegコマンドラインから叩くという怠惰な実装だし、OpenCV-FFmpegバックエンドでフレームをフェッチして解析しつつアプリとしてのFFmpegで動画編集を行うというのはなんか作りとして美しくないのでそこを変えたいというモチベもあるのでGStreamerで頑張る予定。
パイプライン面倒でもどうせ実行時に毎度パイプラインユーザーが書けって話ではないですしね。

2. インストール

インストールからサンプル実行まで。

2.1. 参照ページ

Rustのgstreamer crate のページを参照。
より詳細な説明がGitlab のリポジトリにあったので、基本的にこちらを参照して実行しました。
また、こちらのリポジトリのexpamples以下にサンプルがあるようなので動作チェックもかねてリポジトリをcloneしておきます。

今回はGStreamerはBinaryからインストールしました。
注意点は2つ

  • RuntimeとDevelepの両方ともインストールする必要がある
  • リポジトリ上は「Completeで入れてね!」って記載がある
    Completeだと権利(特許とかライセンス)があるモジュールも含まれるので商用利用を予定している際には注意が必要ですね。
    多分全機能を使った開発をしなければ、通常インストールでも事足りるような気はする。

あと、pkg-configを入れてPKG_CONFIG_PATHの設定をしろとの記載があったのでその作業も。
PKG_CONFIG_PATHの設定は上記のページでは以下の様な感じでした

$ export PKG_CONFIG_PATH="c:\\gstreamer\\1.0\\x86_64\\lib\\pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"

ん?Windows export無くない?と思ったので、とりあえず

<Gstreamerインストールディレクトリ>\1.0\msvc_x86_64\lib\pkgconfig

を設定しておきました。

で先ほどcloneしたリポジトリのexamplesディレクトリをcargo buildしたらビルド成功しました。

3. サンプル実行

とりあえず、メインがいっぱいあったのでその中からplaybin(playbin.rs)を実行。

cargo run --bin playbin

すると

(playbin.exe:13932): GStreamer-WARNING **: 13:08:54.964: Failed to load plugin 'D:\gstreamer\1.0\msvc_x86_64\lib\gstreamer-1.0\gstwavpack.dll': 指定されたモジュールが見つかりません。
This usually means Windows was unable to find a DLL dependency of the plugin. Please check that PATH is correct.
You can run 'dumpbin -dependents' (provided by the Visual Studio developer prompt) to list the DLL deps of any DLL.
There are also some third-party GUIs to list and debug DLL dependencies recursively.

(playbin.exe:13932): GStreamer-WARNING **: 13:08:55.000: Failed to load plugin 'D:\gstreamer\1.0\msvc_x86_64\lib\gstreamer-1.0\gstwavpack.dll': 指定されたモジュールが見つかりません。
This usually means Windows was unable to find a DLL dependency of the plugin. Please check that PATH is correct.
You can run 'dumpbin -dependents' (provided by the Visual Studio developer prompt) to list the DLL deps of any DLL.
There are also some third-party GUIs to list and debug DLL dependencies recursively.
Usage: playbin uri
error: process didn't exit successfully: `D:\workspace\gstreamer-rs\target\debug\playbin.exe` (exit code: 0xffffffff)

なんか依存gstwavpack.dllがするdllが無いぞって出てきたので、dependeniesで調査。

f:id:savaki:20220313131231p:plain
依存調査

wabpack.dllが無いとのこと。

www.wavpack.com

こちらからWavPack DLLをダウンロードしてパスを通す。
これで大丈夫やろ…と思って実行したが、再度上記のエラーが発生。
とりあえず、WavPack DLLをインストールした場所(C:\programs\wavpack-5.4.0-dll\x64)を確認してみると。

あ、wavpackdll.dll しかないじゃん

とりあえず、こいつを消すのは忍びないのでコピーしてwavpack.dllに改名してみると。

cargo run --bin playbin file:///c:/Users/username/Videos/XXXX.mp4

動画再生されました…(適当にmp4ファイルを指定)。どうやらwavpackのバージョンによってはdllの名前が変わっているとかその手のヤツっぽいです。
まだRust側のビルドの設定とか慣れてないのでアレですが、ビルドファイルかdllインポートしている箇所を書き換えるのがスジっぽいな…。
wavpack.dllとwavpackdll.dllのしばらく暫定対処で行きます。

コミュニティの方から連絡いただきまして次の1.20.1で修正対応されるそうです。(Windowsの際にwavpack.dllを削除していた箇所を除外。)

3. まとめ

なんか上手くサンプルがまとまってなかったりはしますが、とりあえずはちゃんと使えそうなので安心しました。
Dependenciesで足りないの探して引っ張ってくれば大丈夫なはず。