代码之家  ›  专栏  ›  技术社区  ›  Ian Wetherbee

VLC Python EventManager回调类型?

  •  10
  • Ian Wetherbee  · 技术社区  · 15 年前

    在使用VLC Python绑定时,我很难附加事件处理程序来判断歌曲何时播放完毕。event\u 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 回复  |  直到 15 年前
        1
  •  12
  •   Rolf of Saxony    5 年前

    下面是最新版本的基本代码 vlc.py 使用 event_manager :

    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

        2
  •  10
  •   Ian Wetherbee    15 年前

    找到了,VLC.py公司包括一个小的decorator ctypes函数,用于包装回调:

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

    使用方法:

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

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

    推荐文章