Вы должны начать наблюдать свойства loadedTimeRanges текущего элемента, например:
AVPlayerItem* playerItem = self.player.currentItem;
[playerItem addObserver:self forKeyPath:kLoadedTimeRanges options:NSKeyValueObservingOptionNew context:playerItemTimeRangesObservationContext];
Затем в смотровом обратном вызове, вы осмысливать данные, которые вы прошли, как это:
-(void)observeValueForKeyPath:(NSString*)aPath ofObject:(id)anObject change:(NSDictionary*)aChange context:(void*)aContext {
if (aContext == playerItemTimeRangesObservationContext) {
AVPlayerItem* playerItem = (AVPlayerItem*)anObject;
NSArray* times = playerItem.loadedTimeRanges;
// there is only ever one NSValue in the array
NSValue* value = [times objectAtIndex:0];
CMTimeRange range;
[value getValue:&range];
float start = CMTimeGetSeconds(range.start);
float duration = CMTimeGetSeconds(range.duration);
_videoAvailable = start + duration; // this is a float property of my VC
[self performSelectorOnMainThread:@selector(updateVideoAvailable) withObject:nil waitUntilDone:NO];
}
Затем селектор в главном потоке обновляет индикатор, например так:
-(void)updateVideoAvailable {
CMTime playerDuration = [self playerItemDuration];
double duration = CMTimeGetSeconds(playerDuration);
_videoAvailableBar.progress = _videoAvailable/duration;// this is a UIProgressView
}
Да, я делаю ползунок с продолжительностью. Но если пользователь скользит мимо загруженного, то плохие новости. Так что я хочу прогресс загруженного/воспроизводимого трека, верно? Имеет ли это смысл? – slowman21
Насколько я понимаю, я не уверен в этом, но вы можете включить поиск только в пределах диапазонов, указанных в 'self.player.currentItem.loadedTimeRanges'. – Michal
Да, мне тоже нужно будет это сделать. Но все же было бы неплохо, если бы пользователи увидели, что загрузилось. Как настоящий стример. – slowman21