AVPlayer replaceCurrentItemWithPlayerItem ne fonctionne pas sur iOS 4.3.3+
J'ai un lecteur audio que je suis en train de construire à l'aide de AVPlayer.
Actuellement, je garde le player
exemple autour et quand j'ai besoin de swap de pistes (soit à partir d'une sélection manuelle ou la piste a atteint la fin) j'ai créer un nouveau AVPlayerItem
et j'appelle replaceCurrentItemWithPlayerItem
avec le nouvel élément.
Selon les docs, replaceCurrentItemWithPlayerItem
est une opération asynchrone, donc j'ai également observer les currentItem chemin d'accès clé du joueur. Quand on le fait appelé, je dis à mes joueurs de jouer.
Voici le code correspondant:
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];
}
Et ici est la valeur de la clé de l'observation de rappel:
- (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];
}
}
Sur iOS 4.3.3 (et iOS 5) mes clés à l'observation de la méthode est appelée, mais _player.currentItem
est toujours nil
. Sur 4.2.1 et 4.3.2 cette propriété contient la valeur réelle. Cette méthode n'est jamais appelé de nouveau. Donc, en substance, en remplacement semble toujours voués à l'échec.
Cela semble être un bug, mais peut-être que je suis en train de faire quelque chose de mal.
source d'informationauteur Ben Scheirman
Vous devez vous connecter pour publier un commentaire.
J'ai eu ce problème avec iOS 5 (y compris 5.0.1). Il l'habitude de travailler bien sur iOS 4.x.
Il y a deux façons de contourner ce problème, de libération et de recréer votre
AVPlayer
avec lesAVPlayerItem
s chaque fois que vous devez échanger les pistes. Ou, il suffit d'appelerreplaceCurrentItemWithPlayerItem:
sur le thread principal.J'ai essayé les deux options, et ils ont travaillé très bien.
Crédits: Forums Des Développeurs Apple
J'ai été confronté à des problèmes similaires. Vous avez probablement commencé à partir de AVPlayerDemoPlaybackViewController d'Apple exemple de code comme moi. Peut-être le problème, pourquoi
currentItem
estnil
est parce qu'il n'est pas encore chargé, ou prêt pour la lecture (mon problème était que je ne pouvais pas obtenir la durée de la nouvelleAVPlayerItem
).Vous pouvez essayer de commencer la lecture quand on l'observe de statut de la
currentItem
estReadyToPlay
.Je ne sais pas si ce sera wok pour vous, je n'ai pas essayer sur plus faible ou plus élevée que 4.3.4 iPad, donc je suppose que je vais courir dans les complications bientôt.