【问题标题】:What is the difference between AVPlayerItem.duration and AVPlayerItem.asset.duration?AVPlayerItem.duration 和 AVPlayerItem.asset.duration 有什么区别?
【发布时间】:2026-01-03 11:20:07
【问题描述】:

我正在 KVO-ing AVPlayer.timeControlStatus 属性,玩家有一个 AVPlayerItem

视频是一个mpeg4 编码的 10 秒视频文件,托管在远程服务器上:

let asset = AVURLAsset(url: url, options: [AVURLAssetPreferPreciseDurationAndTimingKey: true])
let item = AVPlayerItem(asset: asset)

let player = AVQueuePlayer()
player.actionAtItemEnd = .pause
player.automaticallyWaitsToMinimizeStalling = false
player.insert(item, after: nil)

当属性第一次更改为.playing 时,我在调试控制台中查看持续时间值:

(lldb) po player.currentItem?.asset.duration
▿ Optional<CMTime>
  ▿ some : CMTime
    - value : 1281
    - timescale : 600
    ▿ flags : CMTimeFlags
      - rawValue : 1
    - epoch : 0

(lldb) po player.currentItem?.duration
▿ Optional<CMTime>
  ▿ some : CMTime
    - value : 0
    - timescale : 0
    ▿ flags : CMTimeFlags
      - rawValue : 17
    - epoch : 0

为什么这些值不同?

【问题讨论】:

    标签: ios avplayer avplayeritem


    【解决方案1】:

    player.currentItem?.duration 为 0 时表示无限期,换句话说,您正在播放直播。

    我不确定,但player.currentItem?.asset.duration 是用户可以使用滑块移动的总时间,这可能会随着播放器缓冲的时间而变化

    【讨论】:

    • 我已将代码添加到问题中,该 URL 不是 HSL 直播,它是一个远程 mp4 文件。
    最近更新 更多