web-dev-qa-db-fra.com

AVPlayer, notification pour l'état de lecture/pause?

Je cherche un moyen d’être averti du moment exact où AVPlayer commence à jouer. Il y a la propriété "rate", mais je la vérifie périodiquement avec un NSTimer pour obtenir les mises à jour.

J'ai essayé le KVO, mais apparemment ce n'est pas conforme au KVO.

Je sais qu'il y a des événements quand le joueur S'EST TERMINÉ . Mais je parle de pause ici.

Je me suis également abonné à KVO AVPlayerItem's "status", mais il me montre que l'actif HTTP a fini de se mettre en cache, pas de lecture/pause. J'ai également commencé à collecter tous les appels de lecture/pause, en demandant une mise à jour instantanée de l'interface utilisateur, mais il faut encore un peu plus de runloops avant que AVPlayer ne commence réellement à jouer. J'aimerais juste mettre à jour mon bouton instantanément.

26
steipete

Pour i OS 10 les versions ultérieures Vous pouvez vérifier la nouvelle propriété d’AVPlayer timeControlStatus .

if(avPlayerObject.timeControlStatus==AVPlayerTimeControlStatusPaused)
{
//Paused mode
}
else if(avPlayerObject.timeControlStatus==AVPlayerTimeControlStatusPlaying)
{
 //Play mode
}
13
The iCoder

Pourquoi dites-vous que "taux" n'est pas une plainte du KVO? Cela fonctionne pour moi.

Voici ce que j'ai fait:

- (void)viewDidLoad
{
    ...

    [self.player addObserver:self forKeyPath:@"rate" options:0 context:nil];
}

Et alors:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"rate"]) {
    if ([self.player rate]) {
        [self changeToPause];  // This changes the button to Pause
    }
    else {
        [self changeToPlay];   // This changes the button to Play
    }
}
}
47
raixer

AVPalyer en tant qu'observateur par défaut pour suivre la durée actuelle de la vidéo. Lorsque vous suspendez ou reprenez la vidéo, vous pouvez obtenir une pause en utilisant une variable globale (dans l'observateur, mettez à jour cette variable)

Intervalle CMTime = CMTimeMake (1, 1);

//The capture of self here is coming in with your implicit property access of self.currentduration - you can't refer to self or properties on self from within a block that will be strongly retained by self.

//You can get around this by creating a weak reference to self before accessing timerDisp inside your block
__weak typeof(self) weakSelf = self;

self.timeObserverToken = [_player addPeriodicTimeObserverForInterval:interval queue:NULL usingBlock: ^(CMTime time)
{
    _currentDuration = (int)CMTimeGetSeconds (_player.currentTime);

    if(!_isPlaying)
    {
        _pausedDuration = _currentDuration;
    }
}
6
Kumar Swamy
    player = AVPlayer(url: URL(fileURLWithPath: path))
player.addObserver(self, forKeyPath: "rate", options: NSKeyValueObservingOptions.new, context: nil)

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == "rate" {
        if player.rate > 0 {
            print("video started")
        }
    }
}

à Swift

0
Jatin Rathod