在 IOS 9 上使用 AVPlayer 和 Swift 反向播放视频
Posted
技术标签:
【中文标题】在 IOS 9 上使用 AVPlayer 和 Swift 反向播放视频【英文标题】:Play video in reverse using AVPlayer and Swift on IOS 9 【发布时间】:2015-11-26 23:42:31 【问题描述】:我有一个录制的视频片段,我想反向播放。
向前播放很好,但只要我搜索到视频文件的结尾并将播放速率设置为 -1.0,视频剪辑就会搜索到剪辑的结尾(我在视频上方的时间线栏中看到了这一点) 但不反向播放。
在我展示播放器视图控制器后,我检查它是否可以使用:
print("readyForDisplay = \(playerViewController.readyForDisplay)")
这告诉我一切都准备好了。
我检查是否可以反向播放:
let reversePlay = playerViewController.player!.currentItem?.canPlayReverse
print("reversePlay = \(reversePlay)")
这返回 TRUE
然后我寻找到剪辑的结尾并将播放速率设置为 -1.0 以进行反向播放。
playerViewController.player!.seekToTime(playerViewController.player!.currentItem!.asset.duration)
playerViewController.player!.rate = -1.0
我相信它已经准备好玩了,因为如果我添加以下内容:
let status : AVPlayerItemStatus? = playerViewController.player!.currentItem?.status
if status == AVPlayerItemStatus.ReadyToPlay
print("Ready to play")
它显示剪辑已准备好播放,因此我假设已完成搜索到剪辑结尾(只有 2 秒长)。
然后我播放剪辑:
playerViewController.player!.play()
如果我不寻找到最后并尝试更改速率以将其设置为反向播放,它会正常播放。
我在这里错过了什么?
【问题讨论】:
它是否因为在最后而立即被解雇?你试过seekToTime
到中间的某个位置吗?如果这是问题所在,您可以将其设置为距离结束 1-2 秒。
@Headstock67 请注意,在检查 canPlayReverse 并将播放速率设置为 -1 后,您需要使用 reversePlaybackEndTime 来检查结束时间
感谢蒂姆的建议。我使用 seekToTime 到视频剪辑的中间。播放时它跳到中间,然后继续向前播放。所以将播放速率设置为 -1.0 似乎不会强制反向播放。
Leo,感谢您的提示。我不完全确定您所说的“检查结束时间”是什么意思 我浏览了 Apple 文档,它指出 reversePlaybackEndTime 默认为 kCMTimeInvalid,在这种情况下,反向播放的有效时间是 kCMTimeZero,我知道这是一个持续的持有视频开始点。为了确保它是针对视频的开始,我尝试将 reversePlaybackEndTime 设置为 kCMTimeZero,在将速率设置为 -1.0 之后,但这没有任何区别。
【参考方案1】:
我决定在启动视频后添加一些日志记录,发现启动前速率为 -1,启动后立即为 1,因此速率似乎重置为 1。
这可能是一个错误吗?
无论如何在请求播放视频后立即设置速率具有期望的效果。
【讨论】:
那是因为 play() 方法的文档中说:“调用此方法与将速率设置为 1.0 相同。”以上是关于在 IOS 9 上使用 AVPlayer 和 Swift 反向播放视频的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 上使用 avaudioengine 会破坏 avplayer