Доступ к экземпляру проигрывателя во время потоковой передачи
Я пытаюсь создать простой медиаплеер, используя python-vlc
lib. Также я пытаюсь запустить это в отдельном потоке, чтобы одновременно выполнять другие задачи.
Теперь у меня возникли проблемы с тем, чтобы игрок действительно играл на протяжении всего списка воспроизведения. Но теперь событие потока, которое запускается после завершения списка воспроизведения, не позволяет мне получить доступ к проигрывателю для таких задач, как "пропустить одну песню вперед", "установить громкость" и т. Д. Во время фактического воспроизведения.
Я не очень хорошо знаком с потоками, и поэтому мне было интересно, какие лучшие решения были бы для этого.
# import built-in modules
from itertools import count
import os
from threading import Event, Thread
# import third-party modules
import vlc
class Player:
def __init__(self):
self.played = count()
self.finished = Event()
vlc_instance = vlc.Instance()
self.media_player = vlc_instance.media_player_new()
self.media_list = vlc_instance.media_list_new()
self.media_list_player = vlc_instance.media_list_player_new()
self.media_list_player.set_media_player(self.media_player)
event_manager = self.media_player.event_manager()
event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, self.end_reached)
def add_media(self, filename):
self.media_list.add_media(filename)
def play(self):
self.media_list_player.set_media_list(self.media_list)
self.media_list_player.play()
def previous(self):
self.media_list_player.previous()
def next(self):
self.media_list_player.next()
def wait(self):
self.finished.wait()
def end_reached(self, event):
if event.type.value == vlc.EventType.MediaPlayerEndReached.value:
if next(self.played) == self.media_list.count():
self.finished.set()
def start_up(directory):
player = Player()
for track in os.listdir(directory):
path = os.path.join(directory, track)
player.add_media(path)
player.play()
#this keeps the thread alive until the event is set to True
player.wait()
if __name__ == '__main__':
directory = '/path/to/music/folder'
x = Thread(target=start_up, args=[directory])
x.start()