Подтвердить что ты не робот

AVPlayer, уведомление о состоянии воспроизведения/паузы?

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

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

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

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

4b9b3361

Ответ 1

Для я OS 10 и более поздних версий вы можете проверить новое свойство AVPlayer timeControlStatus.

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

Ответ 2

Почему вы говорите, что "ставка" не является жалобой KVO? Это работает для меня.

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

- (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
    }
}
}

Ответ 3

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;
    }
}

Ответ 4

    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")
        }
    }
}

в кратчайшие сроки