tony
tony
@vitoziv 我用charles抓包发现,有很多请求的Range是2-end, 但是响应了一部分后,这个请求会被cancel掉,然后从当前的startoffset发起一个新的请求。我把同样的地址mock到其他带预加载和边缓存边播放功能的短视频App上,他们会让这个2-end的请求一直执行到finish状态,而且播放正常,没有出现声音消失的情况。然后我就试着按照这个思路改了代码,最后发现: 播放到一半没有声音是因为VIResourceLoader实现方式有问题。 应该把VIResourceLoadingRequestWorkers做成一个workers队列(NSMutableArray),每次有新request过来,不能把正在进行的request给cancel掉,而应该把新生成的worker放workers队列尾部,最后让workers串行工作:上一个worker执行完毕后检查队列是否有待执行列表,如果有,执行队列中的第一个worker。 原先的这种实现方式有问题: ``` - (void)addRequest:(AVAssetResourceLoadingRequest *)request { [self.pendingRequestWorkers enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, VIResourceLoadingRequestWorker * _Nonnull obj, BOOL * _Nonnull stop) { [obj cancel]; [obj finish]; }]; [self.pendingRequestWorkers...