如何让 Pyglet 媒体队列继续播放?
How do I make the Pyglet media queue continue playing?
我的播放器中正在加载和排队多首歌曲,但是播放器在播放第一首歌曲后停止播放,我不得不使用 next_source() 手动强制播放下一首歌曲,尽管从文档中我相信它应该是自动的。
我是 运行 Python 3.7.1 和 Pyglet 1.3.2,我已经搜索了文档并尝试了不同的数据排队方法。我已经检查过以确保文件正在完整播放,但我不确定播放是否会在第一首歌曲结束。
chosenDirectory = ""
cSong = ""
cSongIndex = 0
player = pyglet.media.Player()
songList = []
def chooseDirectory():
global chosenDirectory
chosenDirectory = tk.filedialog.askdirectory(initialdir="/")
lbl.configure(text=chosenDirectory)
listBox.delete("0", "end")
def listFiles(dir):
global songList
songList = []
files = os.listdir(dir)
for x, file in enumerate(files):
filePath = chosenDirectory + "/" + file
if not os.path.isdir(filePath):
fileExt = file.split(".")[1]
if fileExt == "mp3" or fileExt == "wav":
listBox.insert(x, file)
songList.append(filePath)
listFiles(chosenDirectory)
class mediaControls:
def curSelect(self, info):
global cSong
if listBox.curselection() != ():
selected = listBox.get(listBox.curselection())
if selected != cSong:
cSong = selected
cSongIndex = listBox.curselection()[0]
self.playList()
def playSong(self):
if not player.playing:
player.play()
elif player.playing:
player.pause()
def playList(self):
for song in songList:
music = pyglet.media.load(song)
print(music.duration)
player.queue(music)
self.playSong()
def playNextSong(self):
player.next_source()
def playNewSong(self):
global cSong
global cSongIndex
cSongIndex = cSongIndex + 1
cSong = listBox.get(cSongIndex)
self.playSong()
我的预期结果是循环播放所有歌曲,在继续下一首之前将它们从队列中取出,并且不需要我进行干预。
所以事实证明我期望队列能够处理所有事情而没有意识到 pyglet.app.run() 命令实际上是使所有事件启动的原因。如果不使用它(因为它被阻塞),我可以 on_eos() 继续并调用 next_source() 函数并获得相同的结果。
我想对 global
的使用发表评论,因为您似乎已经处理了它无法继续播放的问题。通过使状态成为 class 的一部分,可以消除对全局的所有使用。当应用程序 运行s 时,它创建了一个 class 的实例,该实例在程序的整个持续时间内都存在 运行。考虑以下。
它不起作用,因为您没有包含整个脚本。 listBox
好像少了,应该也是实例成员。
class mediaControls:
def __init__(self):
self.chosenDirectory = ""
self.cSong = ""
self.cSongIndex = 0
self.player = pyglet.media.Player()
self.songList = []
def chooseDirectory(self):
self.chosenDirectory = chosenDirectory = tk.filedialog.askdirectory(initialdir="/")
lbl.configure(text=chosenDirectory)
listBox.delete("0", "end")
songList = []
files = os.listdir(chosenDirectory)
for x, file in enumerate(files):
filePath = os.path.join(chosenDirectory, file)
if not os.path.isdir(filePath):
fileExt = file.split(".")[1]
if fileExt == "mp3" or fileExt == "wav":
listBox.insert(x, file)
songList.append(filePath)
self.songList = songList
def curSelect(self, info):
if listBox.curselection() != ():
selected = listBox.get(listBox.curselection())
if selected != self.cSong:
self.cSong = selected
self.cSongIndex = listBox.curselection()[0]
self.playList()
def playSong(self):
if not self.player.playing:
self.player.play()
elif self.player.playing:
self.player.pause()
def playList(self):
for song in self.songList:
music = pyglet.media.load(song)
print(music.duration)
self.player.queue(music)
self.playSong()
def playNextSong(self):
self.player.next_source()
def playNewSong(self):
self.cSongIndex = self.cSongIndex + 1
self.cSong = listBox.get(self.cSongIndex)
self.playSong()
我的播放器中正在加载和排队多首歌曲,但是播放器在播放第一首歌曲后停止播放,我不得不使用 next_source() 手动强制播放下一首歌曲,尽管从文档中我相信它应该是自动的。
我是 运行 Python 3.7.1 和 Pyglet 1.3.2,我已经搜索了文档并尝试了不同的数据排队方法。我已经检查过以确保文件正在完整播放,但我不确定播放是否会在第一首歌曲结束。
chosenDirectory = ""
cSong = ""
cSongIndex = 0
player = pyglet.media.Player()
songList = []
def chooseDirectory():
global chosenDirectory
chosenDirectory = tk.filedialog.askdirectory(initialdir="/")
lbl.configure(text=chosenDirectory)
listBox.delete("0", "end")
def listFiles(dir):
global songList
songList = []
files = os.listdir(dir)
for x, file in enumerate(files):
filePath = chosenDirectory + "/" + file
if not os.path.isdir(filePath):
fileExt = file.split(".")[1]
if fileExt == "mp3" or fileExt == "wav":
listBox.insert(x, file)
songList.append(filePath)
listFiles(chosenDirectory)
class mediaControls:
def curSelect(self, info):
global cSong
if listBox.curselection() != ():
selected = listBox.get(listBox.curselection())
if selected != cSong:
cSong = selected
cSongIndex = listBox.curselection()[0]
self.playList()
def playSong(self):
if not player.playing:
player.play()
elif player.playing:
player.pause()
def playList(self):
for song in songList:
music = pyglet.media.load(song)
print(music.duration)
player.queue(music)
self.playSong()
def playNextSong(self):
player.next_source()
def playNewSong(self):
global cSong
global cSongIndex
cSongIndex = cSongIndex + 1
cSong = listBox.get(cSongIndex)
self.playSong()
我的预期结果是循环播放所有歌曲,在继续下一首之前将它们从队列中取出,并且不需要我进行干预。
所以事实证明我期望队列能够处理所有事情而没有意识到 pyglet.app.run() 命令实际上是使所有事件启动的原因。如果不使用它(因为它被阻塞),我可以 on_eos() 继续并调用 next_source() 函数并获得相同的结果。
我想对 global
的使用发表评论,因为您似乎已经处理了它无法继续播放的问题。通过使状态成为 class 的一部分,可以消除对全局的所有使用。当应用程序 运行s 时,它创建了一个 class 的实例,该实例在程序的整个持续时间内都存在 运行。考虑以下。
它不起作用,因为您没有包含整个脚本。 listBox
好像少了,应该也是实例成员。
class mediaControls:
def __init__(self):
self.chosenDirectory = ""
self.cSong = ""
self.cSongIndex = 0
self.player = pyglet.media.Player()
self.songList = []
def chooseDirectory(self):
self.chosenDirectory = chosenDirectory = tk.filedialog.askdirectory(initialdir="/")
lbl.configure(text=chosenDirectory)
listBox.delete("0", "end")
songList = []
files = os.listdir(chosenDirectory)
for x, file in enumerate(files):
filePath = os.path.join(chosenDirectory, file)
if not os.path.isdir(filePath):
fileExt = file.split(".")[1]
if fileExt == "mp3" or fileExt == "wav":
listBox.insert(x, file)
songList.append(filePath)
self.songList = songList
def curSelect(self, info):
if listBox.curselection() != ():
selected = listBox.get(listBox.curselection())
if selected != self.cSong:
self.cSong = selected
self.cSongIndex = listBox.curselection()[0]
self.playList()
def playSong(self):
if not self.player.playing:
self.player.play()
elif self.player.playing:
self.player.pause()
def playList(self):
for song in self.songList:
music = pyglet.media.load(song)
print(music.duration)
self.player.queue(music)
self.playSong()
def playNextSong(self):
self.player.next_source()
def playNewSong(self):
self.cSongIndex = self.cSongIndex + 1
self.cSong = listBox.get(self.cSongIndex)
self.playSong()