[英]pygame.mixer.music plays audio fine but pygame.mixer.Sound gives error 'Unable to open file'
[英]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.