2017-02-22 1 views
1

J'essaie d'utiliser le lecteur natif (AVPlayer) pour reproduire un flux en direct sur iOS. Cependant, j'ai du mal à reprendre la lecture. Lorsque j'arrête la lecture et la reprends après quelques secondes, la lecture commence à partir du moment où j'ai mis en pause au lieu de reproduire le (dernier) échantillon actuel du flux en direct.Reprendre le dernier flux de lecture AVPlayer

Existe-t-il un moyen d'obtenir le dernier échantillon, o configurer AVPlayer pour reproduire à partir du dernier échantillon lorsque vous appuyez sur le bouton Lecture?

+0

Est-ce que recréer le 'AVPlayerItem' de l'URL atteint le comportement souhaité? –

+0

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

+0

Comment faites-vous cela? –

Répondre

0

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.