繁体   English   中英

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

[英]How to open and close a music file properly for pygame mixer without hanging/freezing Python?

我正在用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()

您可以尝试首先使用内存映射文件将整个文件加载到内存中:

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卡。

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

暂无
暂无

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

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