VLC Python事件管理器回调类型?
我在使用VLC的Python绑定时,遇到了一个问题,就是想要添加一个事件处理器来判断一首歌什么时候播放完。但是,event_attach这个函数对回调函数的类型有些不满意,报错了。
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
2 个回答
16
这里是使用 event_manager
的最新 vlc.py
的基本代码:
import vlc
import time
import sys
finish = 0
def SongFinished(event):
global finish
print("\nEvent reports - finished")
finish = 1
def pos_callback(event, player):
sec = player.get_time() / 1000
m, s = divmod(sec, 60)
npos = event.u.new_position * 100
sys.stdout.write('\r%s %02d:%02d (%.2f%%)' % ('Position', m, s, npos))
sys.stdout.flush()
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)
events.event_attach(vlc.EventType.MediaPlayerPositionChanged, pos_callback, player)
player.play()
while finish == 0:
time.sleep(0.5)
注意:媒体播放器有很多事件可以通过这种方式进行监控。
MediaPlayerMediaChanged
MediaPlayerNothingSpecial
MediaPlayerOpening
MediaPlayerBuffering
MediaPlayerPlaying
MediaPlayerPaused
MediaPlayerStopped
MediaPlayerForward
MediaPlayerBackward
MediaPlayerEndReached
MediaPlayerEncounteredError
MediaPlayerTimeChanged
MediaPlayerPositionChanged
MediaPlayerSeekableChanged
MediaPlayerPausableChanged
MediaPlayerTitleChanged
MediaPlayerSnapshotTaken
MediaPlayerLengthChanged
MediaPlayerVout
MediaPlayerScrambledChanged
MediaPlayerESAdded
MediaPlayerESDeleted
MediaPlayerESSelected
MediaPlayerCorked
MediaPlayerUncorked
MediaPlayerMuted
MediaPlayerUnmuted
MediaPlayerAudioVolume
MediaPlayerAudioDevice
要查看完整的当前事件列表,可以在代码中搜索 class EventType
,地址是:
https://github.com/oaubert/python-vlc/blob/master/generated/3.0/vlc.py
10
找到了,VLC.py里有一个小功能,叫做装饰器,它用来处理回调函数:
callbackmethod=ctypes.CFUNCTYPE(None, Event, ctypes.c_void_p)
使用方法:
@callbackmethod
def SongFinished(self, data):
print data
.event_attach(vlc.EventType.MediaPlayerEndReached, SongFinished, 1)