2 votes

Notification lorsque AVQueuePlayer revient au début d'un élément.

J'ai 5 AVPlayerItems dans mon AVQueuePlayer qui est fixé à AVPlayerActionAtItemEndAdvance . J'appuie sur play sur mon IU, et je joue le premier, le deuxième et ensuite je commence à jouer le troisième. Puis j'appuie sur le bouton de rembobinage. Ce que je veux, c'est que la troisième vidéo revienne au début et que je reçoive une notification me permettant d'arrêter. Ce que je vois, c'est que j'obtiens un statut "prêt à jouer" pour le quatrième élément, suivi d'un élément en cours modifié pour le quatrième élément - puis le quatrième élément est joué.

Pourquoi le 4ème élément devient-il l'élément actuel après que le 3ème élément ait été rembobiné à son début ?

La seule façon d'empêcher cela est de régler le lecteur pour qu'il n'avance pas automatiquement ( AVPlayerActionAtItemEndPause ), observer la fin de chaque élément, et espérer recevoir une notification de "fin de lecture" pour le rembobinage du 3ème élément ainsi que lorsque la lecture se termine naturellement. Ensuite, dans mon code d'observateur de fin, je peux vérifier le rythme du lecteur et, en cas de rembobinage, ne pas passer à l'élément suivant.

0voto

David C. Nelson Points 60

La façon dont j'ai géré cela était dans le code de recherche de début, de définir le paramètre actionAtItemEnd à AVPlayerActionAtItemEndNone puis le remettre à zéro. AVPlayerActionAtItemEndAdvance lorsque la recherche prend fin. Sur iOS6, il semble que l'on puisse chercher au-delà du début de la piste. Dans le code de "fin de recherche", je réinitialise la vitesse et le temps actuel avant de commencer la lecture normale.

La méthode suivante est appelée par un dispositif de reconnaissance des gestes de pression longue.

- (IBAction)fastRewind:(id)sender
{
    UIGestureRecognizer *recog = (UIGestureRecognizer*)sender;
    if (recog.state == UIGestureRecognizerStateBegan) {
        if (_player.rate == 1) {
            NSLog(@"fastRewind begin\n%@", sender);
            _player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
            _player.rate = -2;
        }
    } else if (recog.state != UIGestureRecognizerStateChanged) {
        // Ended/Canceled
        NSLog(@"fastRewind end\n%@", sender);
        if (_player.rate < 0) {
            _player.rate = 0;
            if (CMTimeGetSeconds(_player.currentTime) < 0) {
                [_player seekToTime:CMTimeMake(0, 1)];
            }
            _player.actionAtItemEnd = AVPlayerActionAtItemEndAdvance;
            _player.rate = 1;
        }
    }
}

On peut souhaiter accélérer la recherche si elle est maintenue pendant une période plus longue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X