2010-08-29 16 views
7

Tôi đang gặp sự cố khi đính kèm trình xử lý sự kiện để cho biết khi nào một bài hát đã phát xong khi sử dụng các ràng buộc VLC Python. Hàm event_attach đang phàn nàn về kiểu gọi lại.VLC Python EventManager loại gọi lại?

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 

Lỗi:

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

tiếc là tôi nhìn một lần và không thấy nhiều hướng dẫn tốt về những thứ sự kiện python. http://www.google.com/search?hl=vi&client=safari&pwst=1&rls=vi&q=+site:forum.videolan.org+python+vlc+event+attach&sa=X&ei=VO97TLvWL5OqsAPSx7SCBw&ved=0CBsQrQIwAA có thể giúp – rogerdpack

Trả lời

7

Tìm thấy nó, VLC.py bao gồm một ctypes trang trí nhỏ chức năng cho gói callbacks:

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

Cách sử dụng:

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

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

+0

cảm ơn ngọt ngào cho tip – rogerdpack

+1

Phiên bản mới nhất của vlc.py sử dụng trình bao bọc để trang trí như vậy không còn cần thiết nữa –

0

Đây là mã cơ bản cho gần đây vlc.py sử dụng 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)