Ma solution consiste à refuser à l'utilisateur de laisser le lecteur en pause. C'est, détruisant le joueur chaque fois que la lecture est reprise. Et en créant une nouvelle instance à chaque fois, la lecture est destinée à être reprise. Selon la recommandation d'Apple, la seule solution pour savoir si AVPlayer a été arrêté est d'ajouter KVO. C'est:
- (void)setupPlayer {
AVPlayer *player = [AVPlayer playerWithURL:streamURL];
AVPlayerViewController *playerViewController = [[AVPlayerViewController alloc] init];
playerViewController.player = player;
self.playerViewController = playerViewController;
[self configureConstraintsForView:self.playerViewController.view]; //Add Player to View
[self setupObservers];
[player play];
}
- (void)setupObservers {
[self.playerViewController.player addObserver:self
forKeyPath:@"rate"
options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
context:NULL];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey, id> *)change context:(void *)context
if ([keyPath isEqualToString:@"rate"] && self.playerViewController.player.rate == CGPointZero.x) {
[self.playerViewController.view removeFromSuperview];
[self.playerViewController.player removeObserver:self forKeyPath:@"rate"];
[self.playerViewController.player pause];
self.playerViewController = nil;
}
}
Ensuite, lorsque l'utilisateur veut réengager le joueur, il suffit d'appeler -(void)setupPlayer
qui commencent la lecture à partir du dernier échantillon en direct.
Est-ce que recréer le 'AVPlayerItem' de l'URL atteint le comportement souhaité? –
Enfin, la seule solution que j'ai trouvée est de demander l'URL du flux en direct chaque fois que j'ai besoin de reprendre la lecture. – CRoig
Comment faites-vous cela? –