2

在我的应用程序中,我有一个AVPlayer用于播放、擦除等视频文件。我正在尝试实现以下功能,但还没有提出一个好的解决方案......

假设视频文件长 3000 帧,播放头位于第 1000 帧。当用户按下“播放”按钮时,我希望视频播放以第 1000 帧为中心的 10 帧部分,即第 995 帧- 1005。当播放器到达第 995 帧或第 1005 帧时,我希望播放反向。换句话说,帧顺序是:

1000-1001-1002-1003-1004-1005-1004-1003-1002-1001-1000-999-998-997-996-995-996-997-998-999-1000

并无限重复。

我首先尝试使用-addBoundaryTimeObserverForTimes:queue:usingBlock:来定义视频部分的起点和终点,并在块中切换播放器速率的符号。这有时会起作用,但是当视频部分很小时,最终会“错过”其中一个边界,并且视频将继续沿该方向播放,直到到达文件的开头或结尾。

我试图通过添加另一个时间观察器来缓解这种情况,–addPeriodicTimeObserverForInterval:queue:usingBlock:它会检查是否错过了边界并重置循环播放。同样,这有时会起作用,但如果播放区域的开始或结束也恰好是视频文件的第一帧或最后一帧(分别),则会失败。

然后,我尝试设置一个回调,AVPlayerItemDidPlayToEndTimeNotification以便在播放到视频文件的边界时再次重置播放。再一次,这有时会起作用,但最终会停止播放或导致播放在远离文件末尾的方向无限期地播放。

我不知道该怎么做。我可以创建一个AVMutableComposition来模拟效果,但是还有很多其他对象取决于视频播放器的确切时间,这需要对应用程序进行重大检查才能实现一个完整的单独处理系统来模拟适当的视频来自作曲的玩家时间(我现在不太愿意这样做)。有任何想法吗?

4

1 回答 1

1

我想我会在你的情况下做的是你的第二个选择:

使用 addPeriodicTimeObserverForInterval:queue:usingBlock,但为了缓解您描述的问题,请在剪辑的前面和结尾添加一秒钟的空白视频(如果您可以控制剪辑资源)——无论是在源。

如果你不能这样做,我认为查看 AVMutableComposition 可能是有意义的(在合成的前面和后面添加一个空剪辑),然后再次使用 addPeriodicTimeObserverForInterval:queue:usingBlock 就像你指示的那样。

于 2012-07-04T03:04:13.673 回答