1

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)
4

0 に答える 0