【发布时间】:2012-05-30 09:16:40
【问题描述】:
在我的应用程序中,我有一个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 来模拟效果,但是还有很多其他对象取决于视频播放器的确切时间,这需要对应用程序进行大修才能实现一个完整的单独处理系统来模拟作文中适当的视频播放器时间(此时我不太愿意这样做)。有什么想法吗?
【问题讨论】:
标签: iphone objective-c ios ipad avfoundation