AVPlayerViewController 的用法与MPMoviePlayerViewController 有很大不同。您不使用通知,而是使用键值观察来确定与AVPlayerViewController 关联的AVPlayer 对象的当前特征。根据文档:
您可以使用键值观察来观察玩家的状态。所以
您可以安全地添加和删除观察者,AVPlayer 序列化
在播放过程中动态发生的更改通知
调度队列。默认情况下,这个队列是主队列(见
dispatch_get_main_queue)。确保安全访问玩家的
非原子属性,而播放状态的动态变化可能是
报告,您必须使用接收者的通知序列化访问
队列。在常见的情况下,这样的序列化自然是通过
在主线程或队列上调用 AVPlayer 的各种方法。
例如,如果您想知道播放器何时暂停,请在 AVPlayer 对象的 rate 属性上添加观察者:
[self.player addObserver:self forKeyPath:@"rate" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context: &PlayerRateContext];
然后在观察方法中检查new的值是否等于0:
- (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 的通知