使用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的性能的主要内容,如果未能解决你的问题,请参考以下文章

具有缓冲进度的 UISlider - AVPlayer

Swift 2 AVPlayer - 播放下一个视频 上一个视频

AVPlayer seekToTime:循环播放短视频时性能不佳

使用avplayer播放音频时如何将音频缓存到本地

使用多个 AVPlayer 时如何检测哪个视频结束了?

使用 AVPlayer 播放音频时如何在 UIWebView 中暂停音频