2010-08-29 8 views
7

Ho problemi allegando un gestore di eventi per dire quando una canzone è finito di giocare quando si utilizzano i binding Python VLC. La funzione event_attach si lamenta del tipo di callback.Tipo di callback 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 

Errori

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

purtroppo ho guardato una sola volta e non ha visto molti buoni tutorial sulla roba evento pitone. http://www.google.com/search?hl=it&client=safari&pwst=1&rls=en&q=+site:forum.videolan.org+python+vlc+event+attach&sa=X&ei=VO97TLvWL5OqsAPSx7SCBw&ved=0CBsQrQIwAA potrebbe essere utile – rogerdpack

risposta

7

giudicata, VLC.py comprende una piccola funzione ctypes decoratore per callback incarto:

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

Per utilizzare:

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

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

+0

grazie per il suggerimento – rogerdpack

+1

L'ultima versione di vlc.py utilizza un wrapper in modo che tale decoratore non sia più necessario –

0

Ecco codice di base per i più recenti vlc.py utilizzando il event_manager:

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)