Воспроизвести подмножество аудиофайла с помощью Pyglet

Как я могу использовать API pyglet для звука, чтобы воспроизводить подмножества звукового файла, например. от 1 секунды до 3,5 секунд 6-секундного звукового клипа?

Я могу загрузить звуковой файл и воспроизвести его, а также перейти к началу нужного интервала, но мне интересно, как остановить воспроизведение в указанном месте?


person grrussel    schedule 29.12.2009    source источник


Ответы (2)


Похоже, что pyglet не поддерживает установку времени остановки. Ваши варианты:

  1. Опросите текущее время и остановите воспроизведение, когда достигнете желаемой конечной точки. Это может быть недостаточно точным для вас.
  2. Или используйте библиотеку звуковых файлов, чтобы извлечь нужную часть во временный звуковой файл, а затем используйте pyglet для воспроизведения этого звукового файла целиком. Python имеет встроенную поддержку файлов .wav (модуль «wave»), или вы можете использовать инструмент командной строки, такой как «sox».
person dmazzoni    schedule 30.12.2009
comment
Из-за ошибок в pyglet я в конечном итоге выбрал внешний аудиоплеер (afplay, из образцов Core Audio инструментов разработки OSX), который может воспроизводить сегменты файлов в различных форматах. - person grrussel; 04.01.2010

Кажется, этот подход работает: вместо того, чтобы опрашивать текущее время вручную, чтобы остановить воспроизведение, используйте планировщик часов pyglet для запуска обратного вызова остановки один раз после заданного интервала. Это достаточно точно для моего варианта использования ;-)

player = None

def stop_callback(dt):
  if player != None:
    player.stop()

def play_sound_interval(mp3File, start=None, end=None):
  sound = pyglet.resource.media(mp3File)
  global player
  player = pyglet.media.ManagedSoundPlayer()
  player.queue(sound)
  if start != None:
    player.seek(start)
  if end != None and start != None:
    pyglet.clock.schedule_once(stop_callback, end-start)
  elif end != None and start == None:
    pyglet.clock.schedule_once(stop_callback, end)
  player.play()
person grrussel    schedule 30.12.2009