gpt4 book ai didi

ios - 如何预加载 AVPlayerItem

转载 作者:技术小花猫 更新时间:2023-10-29 10:47:11 25 4
gpt4 key购买 nike

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

问题是我需要对预加载哪些项目有更多的控制,例如我想要预加载 3 下一首歌曲和 2 上一首歌曲并准备快速加载。

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

最佳答案

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

如果您想更好地控制预加载,可以通过异步加载 Assets 然后创建 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];
});

}];

关于ios - 如何预加载 AVPlayerItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24107990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com