m3u8 形式のリモート ビデオ (http 経由でストリーミング) の長さを取得しようとしています。ローカル再生時間が長い一部の動画では、アセットの再生時間を取得できません。現在、KVO を使用して AVPlayerItem の .Ready ステータスをキャッチし、デリゲート メソッドを呼び出しています。
let asset = AVURLAsset(URL: url)
let playerItem = AVPlayerItem(asset: asset!)
let player = AVPlayer(playerItem: playerItem!)
....
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if object as? AVPlayerItem == player?.currentItem {
if keyPath == "status" {
guard let status = player?.currentItem?.status
else { return }
delegate?.videoViewController(self, statusDidChange: status)
}
}
}
しかし、私は得ていますCMTime(value: 0, timescale: 0, flags: __C.CMTimeFlags(rawValue: 17), epoch: 0)
メソッドを使用してアセットのデュレーションも取得しようとしましたloadValuesAsynchronouslyForKeys
が、これは同じ値を返します。
デリゲート メソッドが呼び出されると、playerItem.asset.playable は true になりますが、次のプロパティはすべて 0 を返します。
print(asset?.duration)
print(playerItem?.duration)
print(playerItem?.asset.duration)
print(playerItem?.tracks[0].assetTrack.asset?.duration)