我正在尝试循环一段视频,给定两个帧标记(markIn和markOut)。当选择循环选项时,播放器将循环播放该视频片段。我目前有一个循环用于整个视频设置使用Apple的建议,一旦到达结束发送 AVPlayerItemDidPlayToEndTimeNotification 。
我认为实现这一目标的一种干净方法是在达到markOut点时发送通知,如果激活循环,则会将播放器移回markIn点。那么有没有办法按照playerItemDidReachMarkOut的方式创建通知?
我对通知和AVPlayer相当新,所以请原谅我,如果我错过了什么。
答案 0 :(得分:6)
您正在寻找的是边界时间观察者。您为AVPlayer提供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…:::
给它一个对象。
currentTime
与您提供的任何时间完全相同。答案 1 :(得分:1)
[m_player seekToTime:CMTimeMakeWithSeconds(5.0f, time.timescale) toleranceBefore: kCMTimeZero toleranceAfter: kCMTimeZero];