Тип обратного вызова VLC Python EventManager?

У меня возникли проблемы с подключением обработчика событий, чтобы сообщить, когда песня закончила играть при использовании привязок 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

person Ian Wetherbee    schedule 29.08.2010    source источник
comment
к сожалению, я посмотрел один раз и не увидел много хороших руководств по материалам событий python. google.com/ может помочь   -  person rogerdpack    schedule 30.08.2010


Ответы (2)


Вот базовый код для более позднего 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

person Rolf of Saxony    schedule 23.04.2016

Нашел, VLC.py включает небольшую функцию ctypes декоратора для переноса обратных вызовов:

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

Использовать:

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

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

person Ian Wetherbee    schedule 30.08.2010
comment
В последней версии vlc.py используется обертка, так что такой декоратор больше не нужен. - person Chih-Hsuan Yen; 24.12.2014