如何replaceMPMoviePlayer通知?
在iOS 9 MPMoviePlayer和他的所有组件都被弃用。 我们使用MPMoviePlayerController通知,如MPMoviePlayerLoadStateDidChangeNotification, MPMovieDurationAvailableNotification, MPMoviePlayerPlaybackStateDidChangeNotification, MPMoviePlayerReadyForDisplayDidChangeNotification
,来跟踪video服务质量。 但现在用AVPlayerViewController我无法find正确的替代这些通知。
我现在如何replace这些通知?
AVPlayerViewController
与MPMoviePlayerViewController
使用有很大的不同。 您可以使用Key Value Observing来确定与AVPlayer
关联的AVPlayer
对象的当前特征,而不是使用通知。 根据文件:
您可以使用键值观察来观察玩家的状态。 为了安全地添加和移除观察者,AVPlayer将在发送队列上播放时dynamic发生的变化的序列化通知。 默认情况下,此队列是主队列(请参阅dispatch_get_main_queue)。 为了确保安全地访问播放器的非primefaces属性,同时可以报告播放状态的dynamic变化,您必须使用接收者的通知队列序列化访问。 在一般情况下,这种序列化自然是通过在主线程或队列上调用AVPlayer的各种方法来实现的。
例如,如果您想知道播放器何时暂停,请在AVPlayer
对象的rate
属性中添加观察者:
[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
特别有用于查找开始的项目。
同时使用这两个选项,您应该能够replaceMPMoviePlayerController
大部分(如果不是全部)通知
我查看了MPMoviePlayerNotifications
和AVPlayerItemNotifications
的文档,我注意到两件事情。
-
MPMoviePlayerNotifications
不显示它们已被弃用: -
AVPlayerItemNotifications
没有我能看到的任何replace:
所以,我很困惑,你说MPMoviePlayerNotifications
已被弃用,因为文档说他们是可用的。 此外,我不认为AVPlayerItemNotifications
具有MPMoviePlayerNotifications
的替代。