我正在尝试使用 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
一切都很好,演示工作并播放任何视频文件。但由于某种原因,dbus 控制模块不起作用(我不敢相信我刚刚说了可怕的“不起作用”的话):
我已经有了绑定到 MPRIS 2 接口的工作客户端 dbus 代码。我可以控制一个普通的 VLC 媒体播放器实例——它工作得很好,但是上面的例子没有任何反应。dbus 控制模块已正确加载,因为libvlc_add_intf
没有返回错误,我可以在 D-Feet (org.mpris.MediaPlayer2.vlc) 中看到 MPRIS 2 服务。即使在 D-Feet 中,尝试调用 dbus vlc 对象的任何方法都不会返回错误,但没有任何反应。
我是否需要配置其他东西才能使 dbus 模块控制 libvlc 播放器?
谢谢
更新
似乎创建 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])
该脚本可以从命令行运行,例如:
python example_vlc.py file.avi
连接到 vlc dbus 对象的客户端代码太长而无法发布,因此假装我正在使用D-Feet来获取总线连接并向其发布消息。示例运行后,我可以在 d-feet 中看到播放器 dbus 接口,但我无法控制它。我还应该在上面的代码中添加什么以使其正常工作吗?