Pyglet 音频队列 - Python
Posted
技术标签:
【中文标题】Pyglet 音频队列 - Python【英文标题】:Pyglet Audio Queue - Python 【发布时间】:2021-07-16 05:37:56 【问题描述】:import pyglet, pafy
from pyglet.window import key
import urllib.request
from urllib.parse import *
from googleapiclient.discovery import build
api_key = ''
yt = build('youtube', 'v3', developerKey=api_key)
def download_file(search):
try:
os.remove("song.m4a")
except:
pass
request = yt.search().list(
part="snippet",
maxResults=1,
q=search
)
response = request.execute()
items = response['items']
item = items[0]
snippet = item['snippet']
title = snippet['title']
id_ = item["id"]
videoid = id_["videoId"]
url = "https://www.youtube.com/watch?v=" + videoid
info = pafy.new(url)
audio = info.getbestaudio(preftype="m4a")
audio.download('song.m4a', quiet=True)
file = 'song.m4a'
#if len(sys.argv)>1:
# file = sys.argv[1]
#
window = pyglet.window.Window()
#music = pyglet.resource.media(file)
player = pyglet.media.Player()
#player.queue(music)
#player.play()
paused = False
def help():
print("""\nCommands:
\tEsc or x \t Exit program
\tp \t Pause/unpause music
\th \t See this list again""")
print("""Welcome to this music player!
You can give a file as an argument or use the commands below.""")
help()
@window.event
def on_key_press(symbol, modifiers):
global paused
global player
global window
file = 'song.m4a'
if symbol == key.P:
if paused:
print("Resume")
player.play()
paused = False
else:
print("Pause")
player.pause()
paused = True
elif symbol == key.R:
pass
#Doesn't work :P
#player.seek(0)
elif symbol == key.H:
help()
elif symbol == key.ESCAPE:
try:
os.remove("song.m4a")
except:
pass
window.close()
elif symbol == key.Q:
srch = input("Queue Song: ")
download_file(srch)
music = pyglet.media.load(file)
player.queue(music)
#music.play()
player.next_source()
print(f'Added to queue.')
elif symbol == key.S:
srch = input("Play Song: ")
download_file(srch)
music = pyglet.media.load(file)
#music.play()
player.queue(music)
player.next_source()
pyglet.app.run()
pyglet.app.exit()
所以我在 Pyglet 库中遇到了一些问题。我似乎无法让这部分工作。我打电话给player.next_source()
正确吗?因为我刚刚运行symbol == key.S
为srch
输入了一个值,但没有播放任何内容。我的目标是做到这一点,这样当我按下q
时输入的输入将使歌曲排队并在当前歌曲之后自动播放,而按下s
并在那里输入一个值将覆盖队列并对其进行优先排序。一些帮助将不胜感激。
【问题讨论】:
【参考方案1】:首先,您使用的是player.next_source()
。这迫使玩家进入队列中的下一个。所以你的Q键功能不正确,你不是在排队,而是在排队,然后强制它播放。这就是你应该用你的 S 键做什么。我认为您对 next_source
的实际作用感到困惑或混淆。
其次,在加载音乐时,它是从文件本身流式传输的。每次按下键时,您似乎都在覆盖文件(这并不是很理想,而且这样做很容易出错)。所以这不适用于流媒体。
最好的办法是加载整个文件,这样如果文件被覆盖,就不会导致排队缓冲区出现奇怪的问题。尝试改变你的
music = pyglet.media.load(file)
到
music = pyglet.media.load(file, streaming=False)
您也可以将文件下载到单独的文件或临时文件(请参阅tempfile
库)而不是尝试重复使用相同的文件名。
此外,您很可能必须将 music
存储到全局字典或全局列表中,以防止它被垃圾收集。因为music
是函数的局部变量,一旦事件结束就会消失。 (这也意味着当您不再需要它们以防止内存泄漏时,您必须从列表中删除它们)
【讨论】:
以上是关于Pyglet 音频队列 - Python的主要内容,如果未能解决你的问题,请参考以下文章