libvlc和dbus接口

Vla*_*mos 7 python linux gtk dbus libvlc

我正在尝试使用libvlc创建一个基本的媒体播放器,它将通过dbus进行控制.我正在为python使用gtk和libvlc绑定.该代码基于vlc网站的官方示例

我修改的唯一方法是将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
Run Code Online (Sandbox Code Playgroud)

一切都很好,该演示工作并播放任何视频文件.但由于某种原因,dbus控制模块不起作用(我不敢相信我只是说可怕的"不起作用"的话):

我已经有了工作客户端dbus代码,它绑定到MPRIS 2接口.我可以控制一个VLC媒体播放器的正常实例 - 工作正常,但上面的例子没有任何反应.dbus控制模块正确加载,因为libvlc_add_intf没有返回错误,我可以在D-Feet(org.mpris.MediaPlayer2.vlc)中看到MPRIS 2服务.即使在D-Feet中,尝试调用dbus vlc对象的任何方法都不会返回错误但没有任何反应.

我是否需要配置其他内容才能使dbus模块控制libvlc播放器?

谢谢

UPDATE

似乎创建vlc实例并设置更高的详细程度,表明收到了DBus调用,但它们对播放器本身没有任何影响.此外,将RC接口添加到实例而不是DBus,也有一些问题:当我从命令行运行示例时,它将我放到RC接口控制台,我可以在其中键入控制命令,但它具有与DBus - 什么都没发生,没有错误,nada,绝对没有.它完全忽略了这些命令.

有什么想法吗?

更新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])
Run Code Online (Sandbox Code Playgroud)

该脚本可以从命令行运行,如:

python example_vlc.py file.avi
Run Code Online (Sandbox Code Playgroud)

连接到vlc dbus对象的客户端代码太长而无法发布,因此假装我正在使用D-Feet来获取总线连接并向其发布消息.一旦示例运行,我可以看到d-feet中的播放器dbus接口,但我无法控制它.还有什么我应该添加到上面的代码,使其工作?

tsa*_*oth 0

我看不到您的事件循环的实现,因此很难判断是什么导致命令无法识别或被删除。您的线程是否可能丢失堆栈跟踪信息并实际上抛出异常?

如果您添加事件循环和 DBus 命令解析的伪代码版本或简化版本,您可能会得到更多响应?