首页 文章

使用AVPlayer在循环中向前播放一小部分视频,然后向后播放

提问于
浏览
1

在我的应用程序中,我有 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: 来定义视频部分的起点和终点,并在块中切换播放器速率的符号 . 这有时会起作用,但是当视频部分很小时,其中一个边界会得到"missed"并且视频将继续在该方向上播放,直到它到达文件的开头或结尾 .

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

然后,我尝试设置 AVPlayerItemDidPlayToEndTimeNotification 的回调,如果它到达视频文件的边界,则再次重置播放 . 再一次,这适用于SOMETIMES,但最终会停止播放或使播放无限期地播放到远离文件末尾的方向 .

我不知道该怎么做 . 我可能会创建一个 AVMutableComposition 来模拟效果,但是在这一点上我并不愿意这么做 . 有任何想法吗?

1 回答

  • 1

    我想我会做的就是你的第二个选择:

    使用addPeriodicTimeObserverForInterval:queue:usingBlock,但为了缓解您描述的问题,在剪辑的前端和末尾添加一秒空白视频(如果您可以控制剪辑资源) - 在源处 .

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

相关问题