我有一个在设备(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/