2010-08-29 15 views
7

在使用VLC Python绑定时,我无法附加事件处理程序来告诉歌曲何时播放完毕。 event_attach函数抱怨回调类型。VLC Python的EventManager回调类型?

def __init__(self): 
    self.vlc = vlc.Instance() 
    self.vlc_playlist = self.vlc.media_list_new() 
    self.vlc_player = self.vlc.media_list_player_new() 
    self.vlc_player.set_media_list(self.vlc_playlist) 
    self.vlc_events = self.vlc_player.event_manager() 
    self.vlc_events.event_attach(vlc.EventType.MediaPlayerEndReached, self.SongFinished, 1) 
    .... 
def SongFinished(self, *args, **kwargs): 
    pass 

错误:

self.vlc_events.event_attach(vlc.EventType.MediaPlayerEndReached, self.SongFinished, 1) 
return libvlc_event_attach(self, i_event_type, f_callback, user_data) 
    ArgumentError: argument 3: <type 'exceptions.TypeError'>: wrong type 
+1

可惜我看了一次,并没有看到蟒蛇事件东西很多很好的教程。 http://www.google.com/search?hl=zh-CN&client=safari&pwst=1&rls=zh-CN&q=+site:forum.videolan.org+python+vlc+event+attach&sa=X&ei=VO97TLvWL5OqsAPSx7SCBw&ved=0CBsQrQIwAA可能会帮助 – rogerdpack 2010-08-30 17:50:37

回答

7

发现了它,包括VLC.py用于包裹回调小装饰ctypes的功能:

callbackmethod=ctypes.CFUNCTYPE(None, Event, ctypes.c_void_p)

要使用:

@callbackmethod 
def SongFinished(self, data): 
    print data 

.event_attach(vlc.EventType.MediaPlayerEndReached, SongFinished, 1)

+0

甜蜜感谢提示 – rogerdpack 2010-09-02 20:29:55

+1

vlc.py的最新版本使用包装器,这样装饰器就不再需要了 – 2014-12-24 20:56:56

0

下面是使用event_manager的更近vlc.py基本代码:

import vlc 
finish = 0 

def SongFinished(event): 
    global finish 
    print "Event reports - finished" 
    finish = 1 

instance = vlc.Instance() 
player = instance.media_player_new() 
media = instance.media_new_path('vp1.mp3') #Your audio file here 
player.set_media(media) 
events = player.event_manager() 
events.event_attach(vlc.EventType.MediaPlayerEndReached, SongFinished) 
player.play() 
while finish == 0: 
     sec = player.get_time()/1000 
     m, s = divmod(sec, 60) 
     print "%02d:%02d" % (m,s)