У меня есть аудиоплеер, который я собираю с помощью AVPlayer.
В настоящее время я сохраняю экземпляр player
, и когда мне нужно поменять местами треки (либо из ручного выбора, либо до того, как трек достиг конца), я создаю новый AVPlayerItem
и вызываю replaceCurrentItemWithPlayerItem
с новым пункт.
Согласно документации, replaceCurrentItemWithPlayerItem
- это асинхронная операция, поэтому я также наблюдаю путь ключа игрока currentItem . Когда это вызвано, я говорю своему игроку играть.
Вот соответствующий код:
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's 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 это свойство содержит фактическое значение. Этот метод никогда не вызывается снова. Так что, по сути, замена кажется неудачной.
Это похоже на ошибку, но, возможно, я делаю что-то не так.