【问题标题】:how to improve the performance of seek when using avplayer使用avplayer时如何提高seek的性能
【发布时间】:2015-08-06 21:06:24
【问题描述】:

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

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

【问题讨论】:

  • 如果你能提供一些你的实现的示例代码,我想人们更知道可以改进什么。
  • 嗨@kcpac,实际上,我找到了解决方案。我试图让用户使用滑块控件浏览视频。如果我使用seekToTime 进行擦洗,它会很慢。我应该使用的是来自AVPlayerItem的称为stepByCount的方法

标签: ios video avfoundation avplayer seek


【解决方案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()
            }
        })
    }
 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2015-08-27
    相关资源
    最近更新 更多