2010-08-29 21 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)