如何预加载AVPlayerItem

13

我知道使用 AVQueuePlayer 播放 AVPlayerItem 对象列表时,播放器会预加载队列中下一个项目,以便当用户到达该项目时更快地重新加载。

问题是我需要更多地控制哪些项目进行预加载,例如,我想要预加载前2首和后3首歌曲以实现快速加载。

因此,我想自己管理 AVPlayerItem 对象,只是不确定如何预加载 AVPlayerItem
例如,如何预加载前30秒的内容?

1个回答

17

控制资产预加载与控制先前项目是不同的问题。当AVQueuePlayer完成一个项目时,它将与其缓存一起释放它的内存。为了解决这个问题,您可以在将AVPlayerItems添加到播放器中的同时将它们添加到数组中。这样,一旦播放器移除该项,ARC就会知道仍然有对该对象的引用,因此不会释放它。然后,您只需将数组中的项目放回播放器中,所有内容都将已加载。注意:如果从其中永远不删除项目,则可能需要限制此缓存数组的大小,否则它将无限增长。

如果您想更好地控制预加载,可以通过异步加载资产,然后创建AVPlayerItem来实现:

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[NSURL URLWithString:url] options:nil];
NSArray *keys = @[@"playable", @"tracks",@"duration" ];

[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^()
 {
     // make sure everything downloaded properly
     for (NSString *thisKey in keys) {
         NSError *error = nil;
         AVKeyValueStatus keyStatus = [asset statusOfValueForKey:thisKey error:&error];
         if (keyStatus == AVKeyValueStatusFailed) {
             return ;
         }
     }

     AVPlayerItem *item = [[AVPlayerItem alloc] initWithAsset:asset];

     dispatch_async(dispatch_get_main_queue(), ^ {
         [player insertItem:item afterItem:nil];
     });

 }];

2
我不确定这是否正确。我尝试了这种技术,AVPlayerItem每次都会从开头开始加载。也许你正在做一些特定的准备工作来保持缓存在RAM中? - Eugene Alexeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接