Python Pyglet Player.seek()函数不工作?
我试图在Pyglet中构建一个简单的媒体工具,它需要一个seek特性。文件被加载、暂停,然后被告知搜索到特定时间;但是,当调用Player.seek()时,文件不进行查找。下面是我正在使用的测试代码:Python Pyglet Player.seek()函数不工作?,python,python-3.x,media,pyglet,Python,Python 3.x,Media,Pyglet,我试图在Pyglet中构建一个简单的媒体工具,它需要一个seek特性。文件被加载、暂停,然后被告知搜索到特定时间;但是,当调用Player.seek()时,文件不进行查找。下面是我正在使用的测试代码: import os import pyglet from os.path import abspath, isfile def loadsong(filename): # check for file print("Attempting to load "+filename)
import os
import pyglet
from os.path import abspath, isfile
def loadsong(filename):
# check for file
print("Attempting to load "+filename)
filename = abspath(filename)
if not ( isfile(filename) ):
raise Exception(filename+" not found.")
# create a player for this file
song = pyglet.media.load(filename)
source = song.play()
source.eos_action = source.EOS_LOOP
source.pause()
return source
music = loadsong("test.mp3")
music.seek(57)
music.play()
pyglet.app.run()
我做错了什么?我使用的是Python 3.5.2、Pyglet 1.2 alpha 1和AVBin 11 alpha 4。首先,您遇到的错误非常重要。
但我假设这是一个
分段错误(堆芯转储)
行:
music.seek(12)
另一个快速提示,修复缩进!你使用了3个空格,无论你是一个空格迷还是一个标签迷,3个空格都是很奇怪的-
在尝试查找时出现分段错误的原因很可能是因为AVbin,它是一个旧的(而且已经死了的afaik)项目
我拼凑了一个更类似于音乐播放器的东西,下面是一个关于如何将Seek
与wav文件结合使用的示例:
import pyglet
from pyglet.gl import *
from os.path import abspath, isfile
pyglet.options['audio'] = ('pulseaudio', 'alsa', 'openal', 'silent')
pyglet.have_avbin=False
key = pyglet.window.key
def loadsong(filename):
# check for file
filename = abspath(filename)
# create a player for this file
player = pyglet.media.Player()
player.queue(pyglet.media.load(filename, streaming=False))
#player.play()
#song.eos_action = song.EOS_LOOP
#song.pause()
return player
class main(pyglet.window.Window):
def __init__ (self):
super(main, self).__init__(300, 300, fullscreen = False)
self.alive = 1
self.player = loadsong('./test.wav')
def on_draw(self):
self.render()
def on_close(self):
self.alive = 0
def on_key_press(self, symbol, modifiers):
if symbol == key.ESCAPE: # [ESC]
self.alive = 0
elif symbol == key.SPACE:
if self.player.playing:
self.player.pause()
else:
self.player.play()
elif symbol == key.RIGHT:
print('Skipping to:',self.player.time+2)
self.player.source.seek(self.player.time+2)
elif symbol == key.LEFT:
print('Rewinding to:',self.player.time-2)
self.player.source.seek(self.player.time-2)
def render(self):
self.clear()
#source = pyglet.text.Label(str(self.player.source.info.title.decode('UTF-8')), x=20, y=300-30)
volume = pyglet.text.Label(str(self.player.volume*100)+'% volume', x=20, y=40)
p_time = pyglet.text.Label(str(self.player.time), x=20, y=20)
#source.draw()
volume.draw()
p_time.draw()
self.flip()
def run(self):
while self.alive == 1:
self.render()
# -----------> This is key <----------
# This is what replaces pyglet.app.run()
# but is required for the GUI to not freeze
#
event = self.dispatch_events()
x = main()
x.run()
这将完全关闭AVbin,可能有一种方法可以关闭单个源的AVbin。。但是由于我很少玩它,我真的不知道该怎么玩。。于是,它开始了:)
第二:
streaming=False
在media.load()
上,调用是非常重要的,否则您的声音中可能会出现奇怪的瑕疵,或者根本没有声音。我听到一种超高音的刮擦声,没有那面旗子我几乎聋了
除此之外,代码非常简单
self.player.source.seek(<time>)
self.player.source.seek()
在作为pyglet.media.player()实例的播放器对象上调用。它工作得非常出色
另一个解决方法是手动安装似乎运行得更好的,但我不愿意仅出于测试目的而将其安装在这台机器上。。但我多年来收集的总体信息是,旧库更适合Mp3文件。在调用Player.seek()之前,请确保Player.playing为True。 在loadsong()函数的末尾,您调用了pause(),将Player.playing设置为False 你可以试试:
music.play()
music.seek(57)
而不是:
music.seek(57)
music.play()
下面的示例使用pyglet 1.5.6,seek()函数在我的macbook pro上可用,但在我的windows 10上不可用:
import pyglet
from pyglet.window import key
source = pyglet.media.load(VIDEO_FILE_PATH)
fmt = source.video_format
player = pyglet.media.Player()
player.queue(source)
player.play()
window = pyglet.window.Window(width=fmt.width, height=fmt.height)
@window.event
def on_draw():
player.get_texture().blit(0, 0)
@window.event
def on_key_press(symbol, modifiers):
if symbol == key.LEFT:
player.seek(player.time - 3.5)
elif symbol == key.RIGHT:
player.seek(player.time + 3.5)
elif symbol == key.SPACE:
if player.playing:
player.pause()
else:
player.play()
pyglet.app.run()
它实际上根本没有给我任何错误,当然也不是一个错误。文件播放得很好,它只是拒绝实际查找。有没有办法使用与.mp3文件兼容的变通方法?将所有音乐重新编码为.wav是不可行的。@A.Vist文件在这里也可以播放,直到我尝试查找它。然后突然我(在Linux上)遇到了一个segfault。我真的不知道为什么会发生这种情况,但是如果上面的代码没有修复它,并且你不能使用.wav,我最好的猜测是在他们的bitbucket页面上提交一份bug报告。
import pyglet
from pyglet.window import key
source = pyglet.media.load(VIDEO_FILE_PATH)
fmt = source.video_format
player = pyglet.media.Player()
player.queue(source)
player.play()
window = pyglet.window.Window(width=fmt.width, height=fmt.height)
@window.event
def on_draw():
player.get_texture().blit(0, 0)
@window.event
def on_key_press(symbol, modifiers):
if symbol == key.LEFT:
player.seek(player.time - 3.5)
elif symbol == key.RIGHT:
player.seek(player.time + 3.5)
elif symbol == key.SPACE:
if player.playing:
player.pause()
else:
player.play()
pyglet.app.run()