Воспроизведение музыки в режиме Pygame Mixer при длительном простое искажается - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть программа python, которая работает на устройстве (Raspberry Pi Zero W, Raspbian Stretch Lite), и когда пользователь нажимает определенную кнопку, воспроизводит аудиофайл.Для этого я использую функцию pygame mixer.music.play ().Одна команда запускает зацикленное воспроизведение, другая останавливает его.И все это прекрасно работает без проблем, когда программа была только что запущена.Однако, если система остается включенной в течение многих часов (или дней), что-то происходит с воспроизведением звука: оно не запускается сразу, а после некоторой паузы начинается странное, прерывистое воспроизведение: по-видимому, крошечный фрагмент (например, 1/8 или1/10-й секунды) оригинального звука быстро зацикливается, и этот крошечный фрагмент несколько меняется со временем.Я испытал нечто подобное очень давно, когда игра DOS была затруднена из-за чтения дискеты, и воспроизведение музыки на Sound Blaster get застряло в крошечной петле того, что было последним битом аудиоданных, оставшихся в буфере.

Я попытался воспроизвести проблему в простой консоли Python:

from pygame import mixer
mixer.init()
mixer.music.load('file.ogg')
mixer.music.play(-1) # Normal playback
mixer.music.stop()
# Much later
mixer.music.play(-1) # Glitchy playback
# Then stop
mixer.music.stop() # Even though the command returns immediately, the audio stops only after some time

Код инициализирует микшер pygame mixer.init() один раз в начале и постоянно использует один и тот же объект микшера.Я проверил, будет ли все иначе, если объект микшера будет повторно инициализирован:

mixer.quit()
mixer.init()

И, действительно, это решает проблему, и воспроизведение снова становится нормальным.Интересно, что для возврата звонка mixer.quit() потребовалось довольно много времени.По-видимому, деструктор миксера должен был сделать много очистки.Я надеялся, что смогу инициализировать микшер только один раз при запуске программы, но теперь кажется, что есть проблема с этим подходом.

Есть ли какой-нибудь способ, которым один объект микшера мог бы остаться в живых в течение долгого времени?

1 Ответ

0 голосов
/ 19 мая 2019

У меня была та же проблема, и я исправил ее с помощью потока, который, когда программа прекращает воспроизведение музыки, закрывает микшер и снова запускает ее

def player_handler(self):
    if self.player.mixer.music.get_busy() == False: #music ended
        self.player.mixer.quit()            
        self.player.mixer.init()

Мой обработчик запускается каждую секунду, и это исправлено для меня.Не очень элегантно, хотя ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...