Прежде всего, ошибка, которую вы получаете, очень важна.
Но я предполагаю, что это Segmentation fault (core dumped)
на строке:
music.seek(12)
Другой быстрое примечание, исправить отступы! Вы используете 3 пробела и независимо от того, являетесь ли вы космическим парнем или парнем табов - 3 пробела просто нечетны -
Причина, по которой вы получаете ошибку сегментации при попытке поиска, скорее всего, из-за AVbin, это старый (и мертвого афаика).
я взломал вместе что-то более похожее на музыкальный плеер и вот пример того, как вы можете использовать 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()
Несколько важных замечаний:
pyglet.have_avbin=False
Это превратит от AVbin полностью, возможно, есть способ отключить его для отдельных источников. Но поскольку я редко общаюсь с этим, я честно понятия не имею, как это сделать. Так что это идет :)
Во-вторых:
streaming=False
На media.load()
вызова очень важно, в противном случае вы можете получить странные артефакты в вашем звуке и или нет звука на всех. Я получил экземпляр сверхвысокой царапины, которая почти сделала меня глухим без этого флага.
Кроме этого, код довольно прост.
self.player.source.seek(<time>)
Вызывается на объекте игрока, который является экземпляром pyglet.media.Player()
. И он работает блестяще.
Другая работа вокруг будет вручную установить AVbin 7 который появляется работать лучше, но я неохотно, чтобы установить его на этой машине только для целей тестирования .. Но общая информация я собрал над лет, эта старая библиотека работает лучше с Mp3-файлами.
Это на самом деле не дает мне какие-либо ошибки на всех, и, конечно, не Segfault. Файл играет отлично, он просто отказывается фактически искать. Есть ли способ использовать ваше обходное решение, которое остается совместимым с файлами .mp3? Повторное кодирование всей музыки в .wav не представляется возможным. –
@ A.Vist Файл также отлично воспроизводится здесь, пока я не попытаюсь его найти. Тогда я вдруг получу segfault (On Linux). Не могу сказать, почему это происходит, но если приведенный выше код не исправит его, и вы не можете использовать .wav, я бы предпочел записать отчет об ошибке на странице их битбакет. – Torxed