我有一个在设备(Raspberry Pi Zero W,Raspbian Stretch Lite)上运行的python程序,当用户按下某些按钮时,会播放音频文件。为此,我使用pygame mixer.music.play()函数。一个命令开始循环播放,另一个命令停止循环播放。程序刚启动时,这一切都很好,没有任何问题。但是,如果系统连续运行了几个小时(或几天),声音播放就会发生一些事情:它不会立即开始播放,并且在经过一定的暂停后会开始怪异而断断续续的播放:显然是很小的一块(例如1/8或1/10秒钟的原始声音会迅速循环播放,并且微小的片段会随时间变化。我很久以前就经历过类似的事情,当时由于软盘读取而使DOS游戏受阻,而Sound Blaster上的音乐播放陷入了缓冲区中剩下的最后音频数据的微小循环。 / p>
我试图在普通的Python控制台中复制该问题:
const recur = (...values) =>
({ recur, values })
const loop = f =>
{ let acc = f()
while (acc && acc.recur === recur)
acc = f(...acc.values)
return acc
}
const everyNth = (s, n) =>
loop
( (acc = '', x = 0) =>
x >= s.length
? acc
: recur(acc + s[x], x + n)
)
const s = 'abcdefghij'.repeat(30000)
console.time('loop/recur')
const result = everyNth(s, 2)
console.timeEnd('loop/recur')
// loop/recur: 31.615 ms
console.log(result)
console.log(result.length)
// acegiacegiacegiacegiacegiacegiacegia ...
// 150000
该代码从一开始就初始化pygame混合器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
,并始终重复使用相同的混合器对象。我检查了如果混合器对象将被重新初始化,情况是否会有所不同:
mixer.init()
并且确实可以解决问题,并且播放再次恢复正常。有趣的是,mixer.quit()
mixer.init()
调用返回花费了很长时间。显然,混合器析构函数需要进行大量清洁工作。我希望在程序启动时只初始化一次混音器,但是现在看来这种方法存在问题。
有没有办法使单个混合器对象长时间保持活动状态?
答案 0 :(得分:1)
我遇到了同样的问题,并使用一个线程对其进行了修复,该线程在程序停止播放音乐时退出混音器并再次将其初始化
def player_handler(self):
if self.player.mixer.music.get_busy() == False: #music ended
self.player.mixer.quit()
self.player.mixer.init()
我的处理程序每秒运行一次,并且为我修复了该问题。虽然不是很优雅...