使用AVPlayer循环视频片段

时间:2013-07-19 18:00:52

标签: objective-c cocoa avfoundation avplayer nsnotificationcenter

我正在尝试循环一段视频,给定两个帧标记(markIn和markOut)。当选择循环选项时,播放器将循环播放该视频片段。我目前有一个循环用于整个视频设置使用Apple的建议,一旦到达结束发送 AVPlayerItemDidPlayToEndTimeNotification

我认为实现这一目标的一种干净方法是在达到markOut点时发送通知,如果激活循环,​​则会将播放器移回markIn点。那么有没有办法按照playerItemDidReachMarkOut的方式创建通知?

我对通知和AVPlayer相当新,所以请原谅我,如果我错过了什么。

2 个答案:

答案 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…:::给它一个对象。

注释/注意事项/警告

  • 尽管有这个名字,但它们并不一定是“边界”时代。您可以只有一次,即使不这样做,AVPlayer也不会推断出任何时间是开始时间,结束时间,中点还是其他任何时间。
  • 对于相同的“边界”,可以多次调用相同的块。确保你妥善处理(在我的情况下,我必须确保不要两次显示相同的字幕)。
  • 在寻找时不会调用边界时间观察者(同样,在开始和结束的意义上,时间并不真正被解释为“边界”)。如果您直接寻找边界时间(或多或少 - 请参见下一点),获得通知,但寻求两个边界之间或许多边界之间的点不会导致观察。
  • 我说的很近,我的意思是。我多次看到AVPlayer通知的主要情况是AVPlayer稍早通知,然后在(或至少更接近)确切时间再次通知。不要认为currentTime与您提供的任何时间完全相同。

答案 1 :(得分:1)

[m_player seekToTime:CMTimeMakeWithSeconds(5.0f, time.timescale) toleranceBefore: kCMTimeZero toleranceAfter: kCMTimeZero];