future.result()
阻止代码执行,直到返回为止,这意味着您的程序在继续之前一直在等待用户输入,因此,当当前一端结束时,播放器无法自动进入下一个轨道
探测轨道完成播放
control()
在此代码中,
import threading
import queue
import time
class Playback:
def __init__(self):
self.active = False
self.paused = False
def load_file(self, path):
self.path = path
self.length = 5
self.active = True
def play(self):
start_time = time.time()
while time.time() - start_time < self.length:
if not self.active:
break
if not self.paused:
time.sleep(1)
self.active = False
def pause(self):
self.paused = True
def resume(self):
self.paused = False
def stop(self):
self.active = False
def control(input_queue):
while True:
cmd = input().strip()
input_queue.put(cmd)
if cmd == "stop":
break
def play_track(track):
print(f"Playing {track['Title']} by {track['Artist']}...")
playback = Playback()
playback.load_file(track["Path"])
input_queue = queue.Queue()
input_thread = threading.Thread(target=control, args=(input_queue,), daemon=True)
input_thread.start()
playback_thread = threading.Thread(target=playback.play)
playback_thread.start()
while playback.active:
try:
mediactl = input_queue.get(timeout=1)
except queue.Empty:
continue
match mediactl:
case "pause":
playback.pause()
print("Track is paused")
case "resume":
playback.resume()
print("Track is resumed")
case "stop":
playback.stop()
print("Playback is stopped")
return
case "next":
playback.stop()
print("Next track is playing")
return "next"
print("Track finished playing, moving to next track.")
return "next"
control()
在输入线程和主要媒体播放器之间进行通信,而媒体播放器每秒都在不阻止排队的情况下检查每秒的用户输入。