首页 > 解决方案 > 防止 cordova-plugin-playlist 一次缓冲所有曲目

问题描述

几个星期以来,我一直在尝试解决这个问题。问题围绕着一个名为 cordova-plugin-playlist 的 Cordova 插件,该插件利用了 AVQueuePlayer。

问题是当添加大量轨道(30+)时,一些轨道在尝试缓冲时超时。因此, AVQueuePlayer 只能播放我尝试加载的一些曲目(它只是在尝试播放时跳过错误曲目)。超时的曲目总是随机的。尝试仅添加同一列表中的前 15 个左右的曲目会成功,因此它似乎与要添加的曲目数量直接相关。

通过将请求记录到我的服务器,我发现 AVQueuePlayer 试图一次缓冲所有轨道,而不是只缓冲当前轨道,也许是下一个轨道。当有 20 个或更少的曲目时,所有曲目都可以正常加载和播放,但当有 30 个或更多曲目时,请求似乎太多,无法处理,并且在某些曲目能够处理之前,请求就开始超时加载。

所有曲目都是通过 AVQueuePlayer 的 insertItem 方法添加的。这种方法是否会导致轨道在添加后立即开始缓冲?有没有办法防止这种行为?我只想缓冲当前和下一个曲目。还是我从根本上误解了什么?提前感谢您的所有帮助!

标签: objective-ccordovacordova-pluginsavqueueplayer

解决方案


我已经解决了这个问题。如果它对任何人都有帮助,这不是 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 语句。


推荐阅读