Python Pyglet 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)

我试图在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)
   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()