使用AVPlayer循环视频片段

tim*_*son 6 cocoa objective-c avfoundation nsnotificationcenter avplayer

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

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

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

Pet*_*sey 6

您正在寻找的是一个边界时间观察者.你给你的AVPlayer一个CMTimes 列表,它会在玩家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
            */
            ];
    }
];
Run Code Online (Sandbox Code Playgroud)

当然,稍后您必须使用removeTimeObserver:告诉AVPlayer停止此观察.你给它你得到的对象addBoundaryTimeObserver…:::.

备注/注意事项/警告

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