防止cordova-plugin-playlist一次缓冲所有曲目

时间:2018-11-20 21:31:26

标签: objective-c cordova cordova-plugins avqueueplayer

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。万一它对任何人都有帮助,那不是AVQueuePlayer本身的问题,而是cordova-plugin-playlist插件附带的子类AVBidirectionalQueuePlayer。问题出在AVBidirectionQueuePlayer.m(在我的情况下是第217行)中被覆盖的insertItem方法之内。

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语句。