防止cordova插件播放列表同时缓冲所有曲目



我已经尝试解决这个问题好几个星期了。这个问题围绕着一个名为Cordova插件播放列表的Cordova插件,该插件使用AVQueuePlayer。

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

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

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

我已经解决了这个问题。如果它能帮助任何人,这不是AVQueuePlayer本身的问题,而是cordova插件播放列表插件中包含的子类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语句。

最新更新