【问题标题】:How to preload a AVPlayerItem如何预加载 AVPlayerItem
【发布时间】:2014-06-08 16:00:36
【问题描述】:

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

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

所以我想自己管理AVPlayerItem 对象,我只是不确定如何预加载AVPlayerItem
例如,如何预加载前 30 秒?

【问题讨论】:

    标签: ios objective-c avfoundation avplayer


    【解决方案1】:

    控制资产的预加载与控制之前的项目是不同的问题。一旦 AVQueuePlayer 完成一个项目,它将连同它的缓存一起从内存中释放。为了解决这个问题,您可以在将 AVPlayerItems 添加到播放器的同时将它们添加到数组中。这样,一旦 Player 移除该项目,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];
         });
    
     }];
    

    【讨论】:

    • 我不确定这是不是真的。我尝试了这种技术,并且 AVPlayerItem 每次都会从一开始就开始加载。也许您正在做一些特定的准备以将缓存保留在 RAM 中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    相关资源
    最近更新 更多