使用avplayer时如何提高seek的性能
Posted
技术标签:
【中文标题】使用avplayer时如何提高seek的性能【英文标题】:how to improve the performance of seek when using avplayer 【发布时间】:2015-08-06 21:06:24 【问题描述】:我正在使用AVPlayer
创建视频播放器,但seekToTime
方法非常慢。苹果应用程序“照片”的追求性能给我留下了深刻的印象。有谁知道苹果是如何做到如此快速的搜索的?
跟线程有关系吗?我尝试将seekToTime
调用放入调度队列,但也无济于事。
【问题讨论】:
如果你能提供一些你的实现的示例代码,我想人们更知道可以改进什么。 嗨@kcpac,实际上,我找到了解决方案。我试图让用户使用滑块控件浏览视频。如果我使用seekToTime
进行擦洗,它会很慢。我应该使用的是来自AVPlayerItem
的称为stepByCount
的方法
【参考方案1】:
我找到了解决办法。
如果我使用seekToTime
进行擦洗,它会很慢。我应该使用来自AVPlayerItem
的名为stepByCount
的方法。
【讨论】:
给出[playerItem stepByCount:x];
的例子,我们需要什么来代替 x 来重新开始相同的视频。【参考方案2】:
此代码取自:https://developer.apple.com/library/archive/qa/qa1820/_index.html
它有点帮助,并且向前寻找看起来很顺利。但是向后搜索仍然需要太多时间(这里SeekToTime working smoothly just for forwards, freezy on backwards 解释了原因)。
import AVFoundation
class MyClass
var isSeekInProgress = false
let player = <#A valid player object #>
var chaseTime = kCMTimeZero
// your player.currentItem.status
var playerCurrentItemStatus:AVPlayerItemStatus = .Unknown
...
func stopPlayingAndSeekSmoothlyToTime(newChaseTime:CMTime)
player.pause()
if CMTimeCompare(newChaseTime, chaseTime) != 0
chaseTime = newChaseTime;
if !isSeekInProgress
trySeekToChaseTime()
func trySeekToChaseTime()
if playerCurrentItemStatus == .Unknown
// wait until item becomes ready (KVO player.currentItem.status)
else if playerCurrentItemStatus == .ReadyToPlay
actuallySeekToTime()
func actuallySeekToTime()
isSeekInProgress = true
let seekTimeInProgress = chaseTime
player.seekToTime(seekTimeInProgress, toleranceBefore: kCMTimeZero,
toleranceAfter: kCMTimeZero, completionHandler:
(isFinished:Bool) -> Void in
if CMTimeCompare(seekTimeInProgress, chaseTime) == 0
isSeekInProgress = false
else
trySeekToChaseTime()
)
【讨论】:
以上是关于使用avplayer时如何提高seek的性能的主要内容,如果未能解决你的问题,请参考以下文章
Swift 2 AVPlayer - 播放下一个视频 上一个视频