AVPlayer, уведомление о состоянии воспроизведения / паузы? - PullRequest
33 голосов
/ 28 сентября 2011

Я ищу способ получить уведомление о точном моменте, когда AVPlayer начинает играть.Есть свойство "rate", но в настоящее время я периодически проверяю его с NSTimer для получения обновлений.

Я пробовал KVO, но, видимо, он не совместим с KVO.

Я знаю, что там события , когда игрок ENDED .Но я говорю здесь о паузе.

Я также KVO подписался на AVPlayerItem's "status", но он показывает мне, когда ресурс HTTP завершил кэширование, нет воспроизведения / паузы.Я также начал собирать все вызовы воспроизведения / паузы, запрашивая немедленное обновление пользовательского интерфейса, но требуется еще несколько циклов выполнения, прежде чем AVPlayer действительно начнет играть.Я просто хотел бы обновить мою кнопку мгновенно .

Ответы [ 4 ]

47 голосов
/ 09 октября 2011

Почему вы говорите, что «ставка» не является жалобой КВО? У меня это работает.

Вот что я сделал:

- (void)viewDidLoad
{
    ...

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

А потом:

- (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
    }
}
}
14 голосов
/ 13 сентября 2017

Для i OS 10 и выше Вы можете проверить новое свойство AVPlayer timeControlStatus .

if(avPlayerObject.timeControlStatus==AVPlayerTimeControlStatusPaused)
{
//Paused mode
}
else if(avPlayerObject.timeControlStatus==AVPlayerTimeControlStatusPlaying)
{
 //Play mode
}
6 голосов
/ 26 июля 2016

AVPalyer в качестве наблюдателя по умолчанию для отслеживания текущей продолжительности видео, когда вы приостанавливаете или возобновляете видео, вы можете получить время паузы, используя одну глобальную переменную (внутри наблюдателя обновите эту переменную)

интервал 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;
    }
}
0 голосов
/ 08 декабря 2018
    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")
        }
    }
}

в быстром

...