在iOS 9中,MPMoviePlayer及其所有组件均已弃用。
我们使用MPMoviePlayerController通知(如MPMoviePlayerLoadStateDidChangeNotification, MPMovieDurationAvailableNotification, MPMoviePlayerPlaybackStateDidChangeNotification, MPMoviePlayerReadyForDisplayDidChangeNotification
)来跟踪视频服务质量。但是现在使用AVPlayerViewController我找不到这些通知的正确替换。
如何立即替换这些通知?
答案 0 :(得分:8)
AVPlayerViewController
与MPMoviePlayerViewController
的用法有很大不同。您可以使用键值观察来确定与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)
我查看了MPMoviePlayerNotifications
和AVPlayerItemNotifications
的文档,我注意到了两件事。
MPMoviePlayerNotifications
未显示已弃用:
AVPlayerItemNotifications
没有我能看到的任何替代品:
所以,我很困惑你说MPMoviePlayerNotifications
已被弃用,因为文档说它们可用。另外,我认为AVPlayerItemNotifications
不能替代MPMoviePlayerNotifications
。