如何预加载AVPlayerItem

Eya*_*yal 11 objective-c avfoundation ios avplayer

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

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

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

Ore*_*ren 16

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

 }];
Run Code Online (Sandbox Code Playgroud)

  • 我不确定这是不是真的。我尝试了这种技术,每次 AVPlayerItem 都会从头开始加载。也许您正在做一些特定的准备工作以将缓存保留在 RAM 中? (2认同)