Как заменить уведомления MPMoviePlayer?

В iOS 9 MPMoviePlayer и все его компоненты устарели. Мы использовали уведомления MPMoviePlayerController, такие как MPMoviePlayerLoadStateDidChangeNotification, MPMovieDurationAvailableNotification, MPMoviePlayerPlaybackStateDidChangeNotification, MPMoviePlayerReadyForDisplayDidChangeNotification, для отслеживания качества видеосервиса. Но теперь с AVPlayerViewController я не могу найти подходящую замену этим уведомлениям.

Как теперь заменить эти уведомления?


person Roman Truba    schedule 29.09.2015    source источник


Ответы (2)


AVPlayerViewController сильно отличается по использованию от MPMoviePlayerViewController. Вместо использования уведомлений вы используете наблюдение за ключевыми значениями, чтобы определить текущие характеристики объекта AVPlayer, связанного с AVPlayerViewController. Согласно документам:

Вы можете наблюдать за статусом игрока, используя наблюдение за ключом-значением. Чтобы вы могли безопасно добавлять и удалять наблюдателей, AVPlayer сериализует уведомления об изменениях, которые происходят динамически во время воспроизведения в очереди отправки. По умолчанию эта очередь является основной (см. dispatch_get_main_queue). Чтобы обеспечить безопасный доступ к неатомарным свойствам проигрывателя, когда могут сообщаться динамические изменения в состоянии воспроизведения, вы должны сериализовать доступ с помощью очереди уведомлений получателя. В общем случае такая сериализация естественным образом достигается путем вызова различных методов AVPlayer в основном потоке или очереди.

Например, если вы хотите знать, когда ваш проигрыватель был приостановлен, добавьте наблюдателя к свойству rate объекта AVPlayer:

[self.player addObserver:self forKeyPath:@"rate" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context: &PlayerRateContext];

Затем в методе наблюдения проверьте, равно ли значение new нулю:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
    if (context == &PlayerRateContext) {
        if ([[change valueForKey:@"new"] integerValue] == 0) {
            // summon Sauron here (or whatever you want to do)
        }
        return;
    }

    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    return;
}

Многие свойства на AVPlayer можно наблюдать. Ознакомьтесь с справочником по классам.

Кроме того, для объекта AVPlayerItem доступно несколько уведомлений, которые ограничены, но все же полезны.

Уведомления

AVPlayerItemDidPlayToEndTimeNotification

AVPlayerItemFailedToPlayToEndTimeNotification

AVPlayerItemTimeJumpedNotification

AVPlayerItemPlaybackStalledNotification

AVPlayerItemNewAccessLogEntryNotification

AVPlayerItemNewErrorLogEntryNotification

Я нахожу AVPlayerItemDidPlayToEndTimeNotification особенно полезным для поиска элемента в начале после завершения воспроизведения.

Используя эти два параметра вместе, вы сможете заменить большинство, если не все уведомления для MPMoviePlayerController.

person Ishan Handa    schedule 02.10.2015
comment
Можете ли вы также предоставить список уведомлений JWPlayer? Не удалось найти краткий список в сети. - person Astha Gupta; 07.09.2016
comment
Как преобразовать MPMoviePlayerPlaybackStateDidChangeNotification в AVPlayer? - person nOOb iOS; 21.09.2017

Я просмотрел документацию для MPMoviePlayerNotifications и AVPlayerItemNotifications и заметил две вещи.

  1. MPMoviePlayerNotifications не показывает, что они устарели:

    введите здесь описание изображения

  2. AVPlayerItemNotifications не вижу замены:

    введите здесь описание изображения

Итак, я смущен тем, что вы говорите, что MPMoviePlayerNotifications устарели, потому что в документах говорится, что они доступны. Кроме того, я не думаю, что у AVPlayerItemNotifications есть замена MPMoviePlayerNotifications.

person Caleb Kleveter    schedule 01.10.2015
comment
Из документации: The MPMoviePlayerViewController class is formally deprecated in iOS 9. (The MPMoviePlayerController class is also formally deprecated.) To play video content in iOS 9 and later, instead use the AVPictureInPictureController or AVPlayerViewController class from the AVKit framework, or the WKWebView class from WebKit. Думаю, это означает, что в будущем не будет MPMoviePlayerNotifications уведомлений. - person Roman Truba; 02.10.2015