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

时间:2019-02-06 23:25:17

标签: python audio pygame

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

有没有办法使单个混合器对象长时间保持活动状态?

1 个答案:

答案 0 :(得分:1)

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

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

我的处理程序每​​秒运行一次,并且为我修复了该问题。虽然不是很优雅...