如何替换MPMoviePlayer通知?

时间:2015-09-29 13:28:55

标签: ios mpmovieplayercontroller ios9 avplayer avplayerviewcontroller

在iOS 9中,MPMoviePlayer及其所有组件均已弃用。 我们使用MPMoviePlayerController通知(如MPMoviePlayerLoadStateDidChangeNotification, MPMovieDurationAvailableNotification, MPMoviePlayerPlaybackStateDidChangeNotification, MPMoviePlayerReadyForDisplayDidChangeNotification)来跟踪视频服务质量。但是现在使用AVPlayerViewController我找不到这些通知的正确替换。

如何立即替换这些通知?

2 个答案:

答案 0 :(得分:8)

AVPlayerViewControllerMPMoviePlayerViewController的用法有很大不同。您可以使用键值观察来确定与AVPlayer关联的AVPlayerViewController对象的当前特征,而不是使用通知。根据文件:

  

您可以使用键值观察来观察玩家的状态。所以   您可以安全地添加和删除观察者,AVPlayer序列化   在播放期间动态发生的变化的通知   调度队列。默认情况下,此队列是主队列(请参阅   dispatch_get_main_queue)。确保安全访问播放器   播放状态的动态变化可能是非原子属性   报告,您必须使用接收方的通知序列化访问   队列。在通常情况下,这种序列化自然是通过实现的   在主线程或队列上调用AVPlayer的各种方法。

例如,如果您想知道播放器暂停的时间,请在rate对象的AVPlayer属性上添加观察者:

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

然后在observe方法中检查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上的许多属性都是可观察的。浏览Class reference

除此之外,还有几个可用于AVPlayerItem对象的通知,这些通知有限但仍然有用。

  

通知

     

AVPlayerItemDidPlayToEndTimeNotification

     

AVPlayerItemFailedToPlayToEndTimeNotification

     

AVPlayerItemTimeJumpedNotification

     

AVPlayerItemPlaybackStalledNotification

     

AVPlayerItemNewAccessLogEntryNotification

     

AVPlayerItemNewErrorLogEntryNotification

我发现AVPlayerItemDidPlayToEndTimeNotification对于在播放完成后将项目设置为开始特别有用。

同时使用这两个选项,您应该能够替换MPMoviePlayerController

的大多数通知(如果不是全部通知)

答案 1 :(得分:1)

我查看了MPMoviePlayerNotificationsAVPlayerItemNotifications的文档,我注意到了两件事。

  1. MPMoviePlayerNotifications未显示已弃用:

    enter image description here

  2. AVPlayerItemNotifications没有我能看到的任何替代品:

    enter image description here

  3. 所以,我很困惑你说MPMoviePlayerNotifications已被弃用,因为文档说它们可用。另外,我认为AVPlayerItemNotifications不能替代MPMoviePlayerNotifications