У меня есть аудиоплеер, который я создаю с помощью AVPlayer.
В настоящее время я сохраняю экземпляр player
и когда мне нужно поменять дорожки (либо с помощью ручного выбора, либо заканчивается трек), я создаю новый AVPlayerItem
, и я вызываю replaceCurrentItemWithPlayerItem
с новым пункт.
В соответствии с документами replaceCurrentItemWithPlayerItem
является асинхронной операцией, поэтому я также наблюдаю текущий ключевой путь текущего игрока. Когда это вызвано, я говорю игроку играть.
Вот соответствующий код:
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
[playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:CHStreamingAudioPlayer_PlayerItemStatusChangedContext];
if (!_player) {
_player = [[AVPlayer alloc] initWithPlayerItem:playerItem];
[_player addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:CHStreamingAudioPlayer_PlayerStatusChangedContext];
[_player addObserver:self forKeyPath:@"currentItem" options:NSKeyValueObservingOptionNew context:CHStreamingAudioPlayer_PlayerCurrentItemChangedContext];
} else {
[_player replaceCurrentItemWithPlayerItem:playerItem];
}
И вот обратный вызов наблюдения ключевого значения:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (context == CHStreamingAudioPlayer_PlayerCurrentItemChangedContext) {
NSLog(@"Player current item changed! Change dictionary: %@", change);
if (_player.currentItem) {
[self play]; //<---- doesn't get called
}
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
В iOS 4.3.3 (и iOS 5) мой ключевой метод наблюдения вызывается, но _player.currentItem
всегда nil
. В 4.2.1 и 4.3.2 это свойство содержит фактическое значение. Этот метод никогда не вызывается снова. Таким образом, по сути, замена, похоже, всегда терпит неудачу.
Это похоже на ошибку, но, возможно, я что-то делаю неправильно.