GTK+でメディアプレーヤーを作る②

作って使う文字起こしツール

前回、入れ物を作って動画を再生するところまでの 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 では小分けされたビデオクリップを、「一つのクリップを繰り返し再生 → あるキーが押されたら次のクリップ」と再生してくれればそれでいいのです。自分で使うためですもんね、多少の謎メッセージはあってもいいことにします。

Python 

関連記事