dbus を介して制御される libvlc を使用して、基本的なメディア プレーヤーを作成しようとしています。Python には gtk および libvlc バインディングを使用しています。コードは、 vlc Web サイトの公式の例に基づいてい ます。
私が変更した唯一のことは、dbus インターフェイスを vlc インスタンスに追加することです
# Create a single vlc.Instance() to be shared by (possible) multiple players.
instance = vlc.Instance()
print vlc.libvlc_add_intf(instance, "dbus"); // this is what i added. // returns 0 which is ok
すべて順調です。デモは動作し、ビデオ ファイルを再生します。しかし、何らかの理由で dbus 制御モジュールが機能しません (恐ろしい「機能しない」という言葉を言っただけだとは信じられません)。
MPRIS 2 インターフェイスにバインドするクライアント dbus コードは既に動作しています。VLC メディア プレーヤーの通常のインスタンスを制御できます。これは問題なく動作しますが、上記の例では何も起こりません。libvlc_add_intf
エラーを返さず、D-Feet (org.mpris.MediaPlayer2.vlc) で MPRIS 2 サービスを確認できるため、dbus 制御モジュールは適切にロードされています。D-Feet でも、dbus vlc オブジェクトのメソッドを呼び出そうとしてもエラーは返されませんが、何も起こりません。
dbus モジュールで libvlc プレーヤーを制御するには、何か他の設定が必要ですか?
ありがとう
アップデート
vlc インスタンスを作成し、より高い冗長性を設定すると、DBus 呼び出しは受信されますが、プレーヤー自体にはまったく影響がないことが示されているようです。また、DBus の代わりに RC インターフェイスをインスタンスに追加すると、いくつかの問題もあります。コマンド ラインから例を実行すると、制御コマンドを入力できる RC インターフェイス コンソールに移動しますが、動作は次のようになります。 DBus - 何も起こらず、エラーもありません。なだ、まったく何もありません。コマンドを完全に無視します。
何かご意見は?
更新 2
libvlc を使用して基本的なプレーヤーを作成するコードは次のとおりです。
from dbus.mainloop.glib import DBusGMainLoop
import gtk
import gobject
import sys
import vlc
from gettext import gettext as _
# Create a single vlc.Instance() to be shared by (possible) multiple players.
instance = vlc.Instance("--one-instance --verbose 2")
class VLCWidget(gtk.DrawingArea):
"""Simple VLC widget.
Its player can be controlled through the 'player' attribute, which
is a vlc.MediaPlayer() instance.
"""
def __init__(self, *p):
gtk.DrawingArea.__init__(self)
self.player = instance.media_player_new()
def handle_embed(*args):
if sys.platform == 'win32':
self.player.set_hwnd(self.window.handle)
else:
self.player.set_xwindow(self.window.xid)
return True
self.connect("map", handle_embed)
self.set_size_request(640, 480)
class VideoPlayer:
"""Example simple video player.
"""
def __init__(self):
self.vlc = VLCWidget()
def main(self, fname):
self.vlc.player.set_media(instance.media_new(fname))
w = gtk.Window()
w.add(self.vlc)
w.show_all()
w.connect("destroy", gtk.main_quit)
self.vlc.player.play()
DBusGMainLoop(set_as_default = True)
gtk.gdk.threads_init()
gobject.MainLoop().run()
if __name__ == '__main__':
if not sys.argv[1:]:
print "You must provide at least 1 movie filename"
sys.exit(1)
if len(sys.argv[1:]) == 1:
# Only 1 file. Simple interface
p=VideoPlayer()
p.main(sys.argv[1])
スクリプトは、次のようにコマンド ラインから実行できます。
python example_vlc.py file.avi
vlc dbus オブジェクトに接続するクライアント コードは長すぎて投稿できないため、代わりにD-Feetを使用してバス接続を取得し、メッセージを投稿するふりをします。サンプルが実行されると、プレーヤーの dbus インターフェイスが d-feet に表示されますが、制御できません。上記のコードを機能させるために追加する必要があるものは他にありますか?