如何在不挂起/冻结pygame混音器的情况下正确地打开和关闭音乐文件?

2024-09-30 02:31:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python2.7开发一个音乐播放器,有个问题我无法解决。在

有时需要卸载我正在播放的SD卡。 因为pygame在pygame.mixer.stop.停止()pygame.mixer.quit.退出() 命令,无法卸载卡。在

因此,我修改了代码,使用文件打开和关闭命令,以便能够在卸载之前正确关闭播放的文件。这样卸载就可以正常工作了。在

我的问题是,python在播放第一首音乐时总是挂起。没有任何异常或错误消息,播放只是停止,程序不响应任何用户输入,甚至Ctrl+C也无法从shell退出执行。在

这种悬挂总是在随机的时间发生,在游戏开始后的1到40秒之间。 如果我直接用游戏机。混音器。音乐.load(myfile)命令,不使用打开/关闭解决方案,我从来没有任何挂起,程序甚至可以正常播放几个小时。在

我应该使用什么解决方案来正确关闭播放的文件(以便能够卸载存储卡)并避免程序挂起?在

这是我代码的相关部分。它关闭上一个播放会话并开始播放新文件。在

FailedMusicLoad = 0
pygame.mixer.music.stop()
pygame.mixer.stop()
pygame.mixer.quit()
try:
        PlayedMp3File.close()
except AttributeError:
        pass

try:                        # test if selected music file can be loaded
        PlayedMp3File = open(Selectedmp3)
except IOError:
        FailedMusicLoad = 1

if FailedMusicLoad <> 1:
    pygame.mixer.init(frequency=musicforlength.info.sample_rate)
    pygame.mixer.music.set_volume(MainVolume)
    pygame.mixer.music.load(PlayedMp3File)
    pygame.mixer.music.play()

Tags: 文件代码命令程序音乐musicload解决方案
2条回答

您可以尝试先使用memory-mapped file将整个文件加载到内存中:

import mmap

...

with open(Selectedmp3) as f: 
    PlayedMp3File = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) 

pygame.mixer.music.load(PlayedMp3File) 
pygame.mixer.music.play()

这样,您只需在将文件加载到内存中时触摸该文件,并使用with确保其正确关闭。在

我找到了一个简单的解决方法来卸载SD卡。在

在卸载它之前,我使用游戏机。混音器。音乐.load()命令。我没有开始播放这个虚拟文件,只要打开它。 之后就没有任何问题了,SD卡似乎被pygame正确释放了,我可以卸载它。在

相关问题 更多 >

    热门问题