繁体   English   中英

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

[英]pygame mixer music ogg playback distorted after long period of idling

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM