6

我正在尝试循环一段视频,给定两个帧标记(markIn 和 markOut)。When the option to loop is selected, the player will loop this segment of the video. 我目前使用 Apple 的建议设置了整个视频的循环,即在到达结束 后发送AVPlayerItemDidPlayToEndTimeNotification 。

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

我对通知和 AVPlayer 还很陌生,所以如果我遗漏了什么,请原谅我。

4

2 回答 2

6

您正在寻找的东西称为边界时间观察者。你给你的 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将完全等于您提供的任何时间。
于 2013-07-20T20:42:46.123 回答
1
[m_player seekToTime:CMTimeMakeWithSeconds(5.0f, time.timescale) toleranceBefore: kCMTimeZero toleranceAfter: kCMTimeZero];
于 2013-07-19T20:14:38.820 回答