前回、入れ物を作って動画を再生するところまでの mojiokosher.py を書きましたが、VLCライブラリの辺りは説明抜きの丸ごとコピペでした。そのためコマンドウィンドウで出ているエラーの意味もよくわかりません。
今回はVLCをもうちょっときちんと勉強しましょう。
② LibVLC vlc フレームワークを使ってメディアを再生する
LibVLCについて
VLCメディアプレーヤーの外部プログラミングインターフェースです。LibVLC (VLC SDK)は、VLCメディアプレーヤーがベースとなっているマルチメディアフレームワークのコアエンジンとインターフェースです。LibVLC SDKは、マルチメディア機能を得るためにアプリケーションに組み込むことができます。したがって、アプリケーションはVLCメディアプレーヤーと同じ機能を持つことになります。
- VLCはC言語で開発されているので、Pythonで使う前にインストールしておきましょう。PythonバインディングはLibVLC APIを完全にカバーしており、生成されるモジュールは純粋な Python です。ctypes にだけ依存しています。
- vlc.py モジュールを Git リポジトリからダウンロードして、Pythonでアクセス可能な場所に配置します。
GTK+について
C言語で書かれたグラフィカル・ユーザーインターフェースを作成するためのツールキットです。
以下のことも知っておいた方がいいでしょう。
- GDK: GIMP の描画キットは xlib と GTK+ ライブラリの間にあり、描画プリミティブ、ラスターグラフィックス (ビットマップ)、カーソル、フォントなどの基本的なレンダリングに加えて、ウィンドウ・イベントやドラッグ&ドロップ機能を扱っています。X11 のようないくつかのウィンドウ・システムのバックエンドを含んでいます。
- GdkX11: GObject パッケージの一部で、X Window System Interaction や X バックエンド固有の関数のためのものです。
- PyGObject: GTK+ / Gdk / GdkX11 などの GObject ベースのライブラリに Python 内でアクセスできるようにする Python モジュールです。
プログラミング・メモ
最初に vlc をインポートしておきます。
import vlc
ノート:
- 描画領域は、Gdk.Windowを取得する前に実現する必要があります。
- ウィンドウのプロパティを直接取得することはできません。
- xidメソッドを使うには GdkX11 をインポートする必要があります。なぜなら、レンダリングサーフェスのウィンドウは GdkX11.X11Window のインスタンスだからです。
- GObject.Object -> Gdk.Window -> GdkX11.X11Window
- そこで、GdkX11をインポートします。
gi.require_version('GdkX11', '3.0')
from gi.repository import GdkX11
レンダリングサーフェスが実現されるとすぐに、そのハンドラ関数は以下の操作を実行します。
- LibVLCインスタンスを作成して初期化し、パラメータとして “–no-xlib” を渡します。
- 空のメディアプレーヤー・オブジェクトを作成します。
self.vlcInstance = vlc.Instance("--no-xlib")
self.player = self.vlcInstance.media_player_new()
なぜ vlcInstance に “–no-xlib” が渡されるのか?
一般に、複数のスレッドが Xlib(libX11とも呼ばれる)を同時に使用している場合、ここではxlibを使用するスレッドを扱っていないため、XInitThreads() 関数を呼び出す必要があります。したがって、Xlibがスレッド用に初期化されていないことをLibVLCに通知します。
Media Rendering Surfaceの X11ウィンドウIDを取得し、メディア出力用にプレーヤーをそのウィンドウにフックします。
win_id = widget.get_window().get_xid()
self.player.set_xwindow(win_id)
再生するメディアの MRL(Media Resource Locator - LibVLCで使用)を設定します。
self.player.set_mrl(media_url)
以上でとりあえず動画が再生されるところまでは行きましたが、今の mojiokosher.py(GTK+でメディアプレーヤーを作る①にコードを記載)ではコマンド・ウィンドウにエラーが出ます。
- main filter error: Failed to create video converter
- vdpau_avcodec generic error: Xlib is required for VDPAU
これが出た時の動画ファイルの形式は .mp4 でした。試しに .webmを再生したところ、2つ目の「vdpau_avcodec generic error」というのは出なくなりました。
あっちこっちのサイトで情報を漁りましたが、結局これらのエラーメッセージの意味はよくわかりませんでした。どうやらVLC本体の設定に関わっているらしく、もしどうしてもエラーメッセージが出なくなるようにしたいならVLCのヘルプを読むしかないみたい。見るからに泥沼にハマりそうです。深入りはやめておきましょうね。
mojiokosher.py では小分けされたビデオクリップを、「一つのクリップを繰り返し再生 → あるキーが押されたら次のクリップ」と再生してくれればそれでいいのです。自分で使うためですもんね、多少の謎メッセージはあってもいいことにします。