15

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
4

2 に答える 2

13

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    

現在の完全なリストについては、 https://github.com/oaubert/python-vlc/blob/master/generated/3.0/vlc.pyclass EventTypeでコードを検索してください。

于 2016-04-23T14:49:00.877 に答える
10

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)

于 2010-08-30T19:45:43.850 に答える