使用avplayer时如何提高seek的性能

how to improve the performance of seek when using avplayer

我正在使用 AVPlayer 创建视频播放器,但是 seekToTime 方法非常慢。 Apple 应用程序 "Photos" 的搜索性能给我留下了深刻的印象。有谁知道 Apple 是如何做到如此快速的搜索的?

跟线程有关系吗?我试图将 seekToTime 调用放入调度队列,它也无济于事。

我找到了解决方案。

如果我使用 seekToTime 进行清理,速度会很慢。我应该使用的是 AVPlayerItem.

中称为 stepByCount 的方法

此代码取自:https://developer.apple.com/library/archive/qa/qa1820/_index.html

有点帮助,求前途顺利。但是向后查找仍然花费了太多时间(这里解释原因)。

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()
            }
        })
    }
 
}