objective-c - 防止 cordova-plugin-playlist 一次缓冲所有曲目
问题描述
几个星期以来,我一直在尝试解决这个问题。问题围绕着一个名为 cordova-plugin-playlist 的 Cordova 插件,该插件利用了 AVQueuePlayer。
问题是当添加大量轨道(30+)时,一些轨道在尝试缓冲时超时。因此, AVQueuePlayer 只能播放我尝试加载的一些曲目(它只是在尝试播放时跳过错误曲目)。超时的曲目总是随机的。尝试仅添加同一列表中的前 15 个左右的曲目会成功,因此它似乎与要添加的曲目数量直接相关。
通过将请求记录到我的服务器,我发现 AVQueuePlayer 试图一次缓冲所有轨道,而不是只缓冲当前轨道,也许是下一个轨道。当有 20 个或更少的曲目时,所有曲目都可以正常加载和播放,但当有 30 个或更多曲目时,请求似乎太多,无法处理,并且在某些曲目能够处理之前,请求就开始超时加载。
所有曲目都是通过 AVQueuePlayer 的 insertItem 方法添加的。这种方法是否会导致轨道在添加后立即开始缓冲?有没有办法防止这种行为?我只想缓冲当前和下一个曲目。还是我从根本上误解了什么?提前感谢您的所有帮助!
解决方案
我已经解决了这个问题。如果它对任何人都有帮助,这不是 AVQueuePlayer 本身的问题,而是cordova-plugin-playlist 插件中包含的子类 AVBidirectionalQueuePlayer 的问题。问题在于 AVBidirectionQueuePlayer.m 中被覆盖的 insertItem 方法(在我的例子中是第 217 行)。
if (CMTIME_IS_NUMERIC(item.duration)) {
NSLog(@"duration: %5.2f", (double) CMTimeGetSeconds(item.duration));
if (CMTimeCompare(_estimatedDuration, kCMTimeZero) == 0)
_estimatedDuration = item.duration;
else
_estimatedDuration = CMTimeAdd(_estimatedDuration, item.duration);
}
item.duration 调用触发轨道加载(每次添加轨道时都会调用它,因此它会触发所有轨道加载),这对于较少数量的轨道很好,但对于 30 多个轨道,一些小时或更长时间,我的服务器超载并且请求超时。
在我的特定例子中,item.duration 似乎从来都不是 NUMERIC ,所以我的解决方案是完全注释掉 IF 语句。
推荐阅读
- c - GCC 编译器中的条件移动 (cmov)
- reactjs - 如何在 TypeScript 中定义 React 类/函数组件(带类型检查)
- java - javafx 迁移到 java 11 - 字符编码问题
- python - 类方法包装一个函数 - 参数问题
- machine-learning - 插补仅用于特征选择步骤,但不适用于 sklearn 管道中的模型输入
- c# - 如何在不同控制器的视图中显示计数
- javascript - 上传图片然后使其可移动和可调整大小
- java - EditTextPreference 不适用于字符串
- c++ - 在 Visual Studio 2015 上使用多个运行时库
- graphql - proxy.writeQuery 奇怪的行为