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

时间:2018-10-12 19:31:48

标签: python pygame hang mixer

我正在用Python 2.7开发音乐播放器,但有一个我无法解决的问题。

有时候,有必要卸载我正在播放的SD卡。 由于pygame仍会在 pygame.mixer.stop() pygame.mixer.quit()之后使最后播放的文件保持打开状态 命令,则无法卸下卡。

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

我的问题是这种解决方案,在播放第一首音乐时python总是挂起。没有任何异常或错误消息,播放只是停止并且该程序不响应任何用户输入,即使Ctrl + C也无法退出shell的执行。

挂起总是在播放开始后1到40秒之间的某个随机时间发生。 如果我使用pygame.mixer.music.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()

2 个答案:

答案 0 :(得分:0)

您可以尝试先使用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可以确保文件正确关闭。

答案 1 :(得分:0)

我发现了一种简单的解决方法,可以卸载SD卡。

在卸载它之前,我使用pygame.mixer.music.load()命令不是从SD卡而是从本地文件系统打开一个虚拟mp3文件。我不会开始播放此虚拟文件,只需打开它即可。 之后没有任何问题,pygame似乎已正确释放了SD卡,因此我可以将其卸载。