为什么AVPlayerItem的canPlayFastForward方法返回False?

Kim*_*rab 7 avfoundation ios avplayer

我真的想用AVFoundation实现快进和反向播放.

据我所知,如果AVPlayerItem的canPlayReverse和canPlayFastForward返回False,我只能用AVPlayer播放0.0~2.0的速率.

但我需要-1.0并且速率超过2.0.

我的问题是我无法找到结果何时以及为何结果为假.

没有提及canPlayFastForward何时在Apple的doc上返回false.

任何人都可以解释何时以及为什么canPlayFastForwardcanPlayReverse的结果是错误的,如何将其更改为true

Cha*_*Raj 4

可能是您正在检查AVPlayerItem'scanPlayReverse或在's 属性更改canPlayFastForward为 之前。如果你这样做,你总会得到。AVPlayerItemstatus.readToPlayfalse

要这样做:

import AVFoundation

let anAsset = AVAsset(URL: <#A URL#>)
let playerItem = AVPlayerItem(asset: anAsset)
let canPlayFastForward = playerItem.canPlayFastForward
if (canPlayFastForward){
   print("This line won't execute")
}
Run Code Online (Sandbox Code Playgroud)

相反,观察其AVPlayerItem属性status。以下是苹果公司的文档

AVPlayerItem 对象是动态的。当项目准备好播放时,对于所有基于文件的资源和一些基于流的资源(如果源播放列表提供允许的媒体),AVPlayerItem.canPlayFastForward 的值将更改为 YES。当播放器项目准备好播放时获得通知的方法是通过键值观察 (KVO) 观察 AVPlayerItem.status 属性。

import AVFoundation
dynamic var songItem:AVPlayerItem! //Make it instance variable

let anAsset = AVAsset(URL: <#A URL#>)
let songItem = AVPlayerItem(asset: anAsset)
playerItem.addObserver(self, forKeyPath: "status", options: .new, context: nil)
Run Code Online (Sandbox Code Playgroud)

覆盖observeValue同一个类中的方法:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if let status = change?[.newKey] as? Int{
            if(status == AVPlayerItemStatus.readyToPlay.rawValue){
               yourPlayer.rate = 2.0 // or whatever you want
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

不要忘记从 SongItem 的状态观察器中删除此类

deinit {
        playerItem.removeObserver(self, forKeyPath: "status")
    }
Run Code Online (Sandbox Code Playgroud)