Ian*_*bee 12 python vlc libvlc
在使用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
Run Code Online (Sandbox Code Playgroud)
错误:
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
Run Code Online (Sandbox Code Playgroud)
发现它,VLC.py包含一个用于包装回调的小装饰器ctypes函数:
callbackmethod=ctypes.CFUNCTYPE(None, Event, ctypes.c_void_p)
使用:
@callbackmethod
def SongFinished(self, data):
print data
Run Code Online (Sandbox Code Playgroud)
.event_attach(vlc.EventType.MediaPlayerEndReached, SongFinished, 1)
这是vlc.py使用的最新代码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)
Run Code Online (Sandbox Code Playgroud)
注意:可以通过这种方式监视媒体播放器的很多事件。
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
Run Code Online (Sandbox Code Playgroud)