您正在寻找的东西称为边界时间观察者。你给你的 AVPlayer 一个 s 列表,它会在播放器大约是这些时间CMTime
时通知你。currentTime
它是这样工作的:
//Use an unretained reference in the block to break the retain cycle of the player retaining the block retaining the player retaining…
__unsafe_unretained AVPlayer *weakPlayer = _myPlayer;
_myObserver = [_myPlayer addBoundaryTimeObserverForTimes:@[ [NSValue valueWithCMTime:markOutTime] ]
queue:dispatch_get_main_queue()
usingBlock:^{
[weakPlayer seekToTime:markInTime
/*optional:
toleranceBefore:kCMTimeZero
toleranceAfter:kCMTimeZero
*/
];
}
];
当然,以后你必须用removeTimeObserver:
来告诉 AVPlayer 停止这种观察。你给它你从中得到的对象addBoundaryTimeObserver…:::
。
注释/警告/警告
- 尽管有名称,但它们不必是“边界”时代。您可以只拥有一个时间,即使您没有,AVPlayer 也不会推断任何时间是否是开始时间、结束时间、中点或其他任何时间。
- 对于同一个“边界”,可能会多次调用同一个块。确保你处理得当(在我的例子中,我必须确保不要两次显示相同的字幕)。
- 搜索时不调用边界时间观察者(同样,时间并没有真正解释为开始和结束意义上的“边界”)。如果您直接寻找边界时间(或多或少——见下一点),您应该会收到通知,但寻找两个边界之间或多个边界之间的一个点不会引起观察。
- 我说的差不多,我是认真的。我见过 AVPlayer 多次通知的主要情况是 AVPlayer 提前通知一点,然后在(或至少更接近)确切时间再次通知。不要假设这
currentTime
将完全等于您提供的任何时间。