python - 长时间闲置后pygame混音器音乐ogg播放失真

标签 python audio pygame

我有一个在设备(Raspberry Pi Zero W,Raspbian Stretch Lite)上运行的python程序,当用户按下某些按钮时,会播放音频文件。为此,我使用pygame mixer.music.play()函数。一个命令开始循环播放,另一个命令停止循环播放。程序刚启动时,这一切都很好,没有任何问题。但是,如果系统连续运行了几个小时(或几天),声音播放就会发生一些事情:它不会立即开始播放,并且在经过一定的暂停后会出现奇怪的断断续续的播放:显然是很小的一块(例如1/8或1/10秒钟的原始声音会迅速循环播放,并且这个微小的片段会随时间而变化。我很久以前就经历过类似的事情,当时由于软盘读取而导致DOS游戏受阻,并且Sound Blaster上的音乐播放陷入了缓冲区中剩下的最后音频数据的微小循环。

我试图在普通的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()花费了很长时间。显然,混合器析构函数需要进行大量清洁工作。我希望在程序启动时只初始化一次混音器,但是现在看来这种方法存在问题。

有什么方法可以使单个混合器对象长时间保持 Activity 状态?

最佳答案

我遇到了同样的问题,并使用线程修复了该问题,该线程在程序停止播放音乐时退出混音器并再次将其初始化

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

我的处理程序每​​秒运行一次,这对我来说是固定的。虽然不是很优雅...

关于python - 长时间闲置后pygame混音器音乐ogg播放失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54564107/

相关文章:

python - 我怎样才能使矩形不会从平台上掉下来?无需使代码过于高级或复杂(python 3 with pygame)

python - 如何在不使用 quit()/sys.exit() 的情况下关闭 pygame 窗口,这样我就不会在游戏外退出循环?

Python,生成随机的括号字符串

python - (Tkinter) 放置对象后如何运行动画?

python - 使用 Python 从 Plotly 获取 &lt;script&gt; 和 <div> 标签

python - Pygame 混音器一次只播放一种声音

python - 如何在 HDP 中的 zeppelin-spark2 中将库安装到 python

c# - 如何在 UWP 应用程序中播放 .mp3(或其他)文件?

ios - Thread1 :EXC_BAD_ACCESS(code=1, 地址 = 0X48) AVAudioPlayer (Swift)

actionscript-3 - AS3 : Recording sound as they are output/played