2010-08-29 12 views
7

Ich habe Probleme, einen Event-Handler anzuhängen, um zu erkennen, wann ein Song bei der Verwendung der VLC Python-Bindungen abgespielt wurde. Die Funktion event_attach klagt über den Callback-Typ.VLC Python EventManager Rückrufart?

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 

Fehler:

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

leider sah ich einmal und nicht viele gute Tutorials auf dem Python-Ereignis Sachen gesehen haben. http://www.google.com/search?hl=de&client=safari&pwst=1&rls=de&q=+site:forum.videolan.org+python+vlc+event+attach&sa=X&ei=VO97TLvWL5OqsAPSx7SCBw&ved=0CBsQrQIwAA könnte helfen – rogerdpack

Antwort

7

es gefunden, umfasst VLC.py eine kleine Dekorateur ctypes Funktion zum Einwickeln Rückrufe:

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

zu benutzen:

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

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

+0

süßen Dank für Der Tipp – rogerdpack

+1

Die neueste Version von vlc.py verwendet einen Wrapper, so dass ein solcher Decorator nicht mehr benötigt wird –

0

ist hier Grundcode für die neueren vlc.py mit der 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)