首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何预加载AVPlayerItem

如何预加载AVPlayerItem
EN

Stack Overflow用户
提问于 2014-06-09 00:00:36
回答 1查看 7.6K关注 0票数 13

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

问题是,我需要更多地控制预加载哪些项目,例如,我希望预加载3首下一首歌曲和2首前一首歌曲,并为快速加载做好准备。

因此,我认为要自己管理AVPlayerItem对象,我只是不确定如何预加载AVPlayerItem

例如,我如何预加载前30秒?

EN

回答 1

Stack Overflow用户

发布于 2014-09-13 00:26:16

控制资产的预加载与控制之前的项目是不同的问题。一旦AVQueuePlayer完成了一个项目,它就会把它和缓存一起从内存中释放出来。要解决这个问题,您可以在将AVPlayerItems添加到播放器的同时将其添加到数组中。这样,一旦玩家移除了该物品,ARC就会知道仍然存在对该物品的引用,并且不会释放它。然后,您可以简单地将数组中的项放回播放器中,所有内容都将被加载。注意:您可能想要限制此缓存数组的大小,否则如果不从其中删除项,它将无限增长。

如果您想对预加载有更多的控制,可以通过异步加载资源然后创建AVPlayerItem来实现:

代码语言:javascript
复制
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];
     });

 }];
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24107990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档