问题描述
我试图让 8 个 16 位 44khz 立体声 wav 文件在一个只有 512MB 内存的树莓派之类的板上同时播放。
我的 Python 不断崩溃,并出现相当不起眼的错误:Killed
,所以我决定使用 python 控制台查看一下。当我以下列方式将 wav 文件添加到混音器时,我注意到在 htop
中 Python 内存使用量随着我添加的文件的大小而增加:
pygame.mixer.init(buffer=4096)
pygame.mixer.Channel(0).play(pygame.mixer.sound("sample_0.wav"),loops=-1)
pygame.mixer.Channel(1).play(pygame.mixer.sound("sample_1.wav"),loops=-1)
pygame.mixer.Channel(2).play(pygame.mixer.sound("sample_2.wav"),loops=-1)
...
我对 pygame 混合器如何工作的理解是它充当 SDL_mixer 的前端,据我所知,它应该在传递文件打开时自动进行分块/缓冲。
这是预期的操作吗? pygame 是否会将整个文件加载到内存中,如果是这样是故意的,缓冲区的目的是什么?
是否旨在让用户手动将音频拆分为缓冲区?似乎不是这样,但 pygame 文档非常模糊..
解决方法
好吧,事实证明 SDL_mixer 库仅支持 Music 对象的文件流式传输,并且常规 Sound 对象始终加载到内存中。