python - 如何提高 pyglet 媒体的加载速度
问题描述
我正在使用 python 和 pyglet 制作一个 MediaPlayer。目前我可以按预期加载任何音频文件。但是我遇到了一个问题,pyglet 似乎只能以 2.4MBps 的速度加载文件。现在这适用于 5 分钟的歌曲。但是,我也希望能够将它用于有声读物。这些可能长达 10 多个小时,大小超过 500MB。
现在有两个问题。
- 加载需要很长时间(Windows 已经将窗口标记为“无响应”)。它最终会加载并播放得很好,只是时间太长了。
- 播放器本身开始消耗 RAM。加载 700MB 有声读物会导致应用程序使用近 5GB 的 RAM。
有没有办法解决这些问题?
不确定我的代码是否有帮助,但这些是我认为最相关的行
import pyglet
self.media = pyglet.media.load(path, streaming=False)
self.player = pyglet.media.Player()
self.player.queue(self.media)
self.player.play()
文件的路径(通常是 .m4a)由程序的其他部分提供
解决方案
streaming = True
是您正在做的事情的解决方案。将流设置为False
将其转换为StaticSource
. AStaticSource
将整个未压缩文件完整地加载到内存中,这对于大文件是不可行的。流式传输一次只获取数据块,并在播放时对其进行解码。这使用更少的内存。
通常,aStaticSource
用于频繁播放或一次播放多次的小声音。如果您有多个球在四处弹跳,并且每次它们落地时都想播放弹跳声音,那么是的,您将禁用流式传输。
如果您想加载多个有声读物并连续播放它们,那么您只需播放器排队更多的媒体源。
推荐阅读
- java - 使用多个 EJB 引用部署 ear Web 应用程序时出现 Glassfish 错误
- jquery - jQuery 基于文本输入字段的乘法值
- java - 如何在 Java 中比较两个二维数组?
- java - Kotlin:使用“val authority”覆盖名为“getAuthorities()”的接口方法
- javascript - 从 firebase 回调中赋值
- javascript - Magento 2 淘汰赛 XML->PHTML->JS->HTML
- javascript - 显示隐藏段落取决于 div 计数
- c++ - 在 C++ 中更改 struct 内部元素的方法?
- powerbi - power bi 中的链接报表
- symfony - 如何在多个级别上更新实体及其关系?