2016-09-19 10 views
2

Я пытаюсь создать простой медиа-инструмент в Pyglet, для которого требуется функция поиска. Файлы загружаются, приостанавливаются, а затем сообщаются в определенное время; однако файл не ищет, когда вызывается Player.seek(). Ниже приведен код проверки, который я использую:Функция Pyglet Player.seek() не работает?

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.

ответ

0

Прежде всего, ошибка, которую вы получаете, очень важна.
Но я предполагаю, что это 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-файлами.

+0

Это на самом деле не дает мне какие-либо ошибки на всех, и, конечно, не Segfault. Файл играет отлично, он просто отказывается фактически искать. Есть ли способ использовать ваше обходное решение, которое остается совместимым с файлами .mp3? Повторное кодирование всей музыки в .wav не представляется возможным. –

+0

@ A.Vist Файл также отлично воспроизводится здесь, пока я не попытаюсь его найти. Тогда я вдруг получу segfault (On Linux). Не могу сказать, почему это происходит, но если приведенный выше код не исправит его, и вы не можете использовать .wav, я бы предпочел записать отчет об ошибке на странице их битбакет. – Torxed

0

Убедитесь, что Player.playing имеет значение True перед вызовом Player.seek(). В конце функции loadong() вы вызывали pause(), которая установит Player.playing равным False.

вы могли бы попробовать:

music.play() 
music.seek(57) 

вместо:

music.seek(57) 
music.play()