pygame.error: set_pos не поддерживается для этого кодека

У меня проблема с аудиоплеером Python. Я использую эту функцию, чтобы приостановить воспроизведение музыки:

def pause(event):
    global time
    pygame.mixer.music.pause()
    time=pygame.mixer.music.get_pos()

И затем я пытаюсь воспроизвести его снова с места, где он останавливается, с помощью этой функции:

def play(event):
    global time
    name=listbox.get(ACTIVE)
    file="music/"+str(name)
    mixer.music.load(file)
    pygame.mixer.music.play()
    if time >0:
        pygame.mixer.music.set_pos(time)
        mixer.music.play()
    else:    
        mixer.music.play()

Но после этого я получаю эту ошибку:

pygame.error: set_pos не поддерживается для этого кодека

Также я попробовал функцию pygame.mixer.music.unpause():

def play(event):
    global time
    name=listbox.get(ACTIVE)
    file="music/"+str(name)
    mixer.music.load(file)
    if time >0:
        mixer.music.unpause()
    else:    
        mixer.music.play()

Но он просто не работает, никаких ошибок в этом случае нет. Я использую python 3.6 и pygame 1.9.3 в Windows 10 (64-разрядная версия).


person akeg    schedule 23.05.2017    source источник


Ответы (2)


Недостаточно представителей, чтобы прокомментировать.

к сожалению, pygame.mixer.music.set_pos() поддерживается только после версии 1.9.2. Поскольку у вас есть 1.9.3, он должен работать в вашем коде. Я не могу выяснить причину, но могу предложить вам альтернативу:

play_time = pygame.mixer.music.get_pos()

Это даст вам время воспроизведения в миллисекундах. тип «play_time» — «int». Инициализируйте переменную 'start = 0'. Теперь вы можете использовать

start = start + play_time/1000.0

каждый раз, когда вы выполняете pause() или stop(), чтобы получить время в секундах. Зачем добавлять его к предыдущему значению, потому что, если вы не добавите «play_time/1000.0» к предыдущему значению start, то get_pos() будет вычислять только время, прошедшее с момента начала игры, и это не даст вам текущего положение, в котором воспроизведение приостановлено или остановлено, но прошло только время с момента начала последнего воспроизведения.

Теперь вы можете сделать это до или после

pygame.mixer.music.pause() #or stop()

Теперь у вас будет время, когда оно было приостановлено.

Вместо использования set_pos() используйте

pygame.music.play(-1, start)

обратите внимание, что play(loop, start_pos) занимает start_pos в секундах. так что нам нужно это в сек. теперь вы можете удалить set_pos()

Альтернатива: просто используйте

pygame.mixer.music.pause()
pygame.mixer.music.unpause()

вам не нужно рассчитывать время, а затем установить его снова.

person GLaDOS    schedule 23.05.2017

Эта ошибка связана с тем, что единицей времени set_pos() являются секунды, а get_pos() — миллисекунды.

Таким образом, ваша функция set_pos() должна передавать time/1000 вместо времени:

pygame.mixer.music.set_pos(time/1000)
person Yibing Ge    schedule 08.11.2018