我尝试在前一个加载完成无缝播放(http流)后加载AVQueuePlayer
的其他项目。我已经离开了苹果的例子 - " AVFoundationQueuePlayer-iOS"。
从我在手机上运行Apples示例中看到的情况来看,当我添加第一个“HTTP直播流”#39;它将加载的项目,一旦完成,我添加另一个,该项目也将加载。查看代码时,每次用户添加项目时,所有Apple都会[self.player insertItem:item afterItem:nil];
。
使用我的queuePlayer
我添加第一个项目,等待它完成加载,然后添加另一个[self.player insertItem:item afterItem:nil];
但这不会导致新项目加载。
这两种情况都是在不播放视频的情况下完成的。只需将它们添加到que中。
我异步加载每个AVURLAsset
并在完成时加载:
if (firstItem) {
// Is the first item. Add to player que
[self.player insertItem:item afterItem:nil];
}else{
// Add the loaded items to an array
NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:item, @"item", date, @"date", nil];
[itemArray addObject:dic];
}
我观察了keyPath" player.currentItem.loadedTimeRanges"第一个项目加载后,添加itemArray
中的下一个项目。
if(smartValue == duration) {
if (itemArray.count != 0) {
NSDictionary *dic = [itemArray objectAtIndex:0];
AVPlayerItem *item = (AVPlayerItem *) [dic valueForKey:@"item"];
// Should cause the item to load ??
[self.player insertItem:item afterItem:nil];
[itemArray removeObjectAtIndex:0];
}
}
现在阅读,我已经看到AVQueuePlayer
在播放器即将完成播放上一个项目之前不会加载下一个项目的答案。但是Apples示例如何加载下一个项目。
苹果添加项目的方法
for (NSString *loadedAssetTitle in self.loadedAssets.allKeys) {
AVAsset *loadedAsset = self.loadedAssets[loadedAssetTitle];
AAPLPlayerViewController __weak *weakSelf = self;
[alertController addAction:[UIAlertAction actionWithTitle:loadedAssetTitle style:UIAlertActionStyleDefault handler:
^(UIAlertAction *action){
NSArray *oldItemsArray = [weakSelf.player items];
AVPlayerItem *newPlayerItem = [AVPlayerItem playerItemWithAsset:loadedAsset];
[weakSelf.player insertItem:newPlayerItem afterItem:nil];
[weakSelf queueDidChangeFromArray:oldItemsArray toArray:[self.player items]];
}]];
}