我正在用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()
答案 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卡,因此我可以将其卸载。