Ответ 1
1) AVPlayer
будет буферизовать видео в нескольких случаях, ни одно не документированное. Я бы сказал, вы можете ожидать буферизации, когда вы запускаете видео, и когда вы заменяете текущий элемент.
Вы можете наблюдать currentItem.loadedTimeRanges
, чтобы узнать, что происходит. Это свойство сообщит вам, какие временные диапазоны видео были загружены.
Кроме того, существует несколько других currentItem
свойств, которые могут вам помочь: playbackLikelyToKeepUp
, playbackBufferFull
и playbackBufferEmpty
.
Достижение идеального безщелезного воспроизведения непросто.
/* player is an instance of AVPlayer */
[player addObserver:self
forKeyPath:@"currentItem.loadedTimeRanges"
options:NSKeyValueObservingOptionNew
context:kTimeRangesKVO];
В observeValueForKeyPath:ofObject:change:context:
:
if (kTimeRangesKVO == context) {
NSArray *timeRanges = (NSArray *)[change objectForKey:NSKeyValueChangeNewKey];
if (timeRanges && [timeRanges count]) {
CMTimeRange timerange = [[timeRanges objectAtIndex:0] CMTimeRangeValue];
NSLog(@" . . . %.5f -> %.5f", CMTimeGetSeconds(timerange.start), CMTimeGetSeconds(CMTimeAdd(timerange.start, timerange.duration)));
}
}
2) Следите за player.rate
.
[player addObserver:self
forKeyPath:@"rate"
options:NSKeyValueObservingOptionNew
context:kRateDidChangeKVO];
Затем в observeValueForKeyPath:ofObject:change:context:
:
if (kRateDidChangeKVO == context) {
NSLog(@"Player playback rate changed: %.5f", player.rate);
if (player.rate == 0.0) {
NSLog(@" . . . PAUSED (or just started)");
}
}
3) Вы можете создать фильм определенной длины с использованием неподвижного изображения, но проще использовать обычный UIImageView
поверх проигрывателя. Скрыть/показать его при необходимости.
Пример проекта: не стесняйтесь играть с код, который я написал для поддержки моего ответа.